ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NWU5NmMKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMzIgQEAKKyMgRW1hY3MKKyp+CitcIypcIworLy5lbWFjcy5kZXNrdG9wCisvLmVtYWNzLmRlc2t0b3AubG9jaworKi5lbGMKKy5cIyoKKworIyBWaXN1YWwgU3R1ZGlvIENvZGUKKy52c2NvZGUvCisKKyMgS0RldmVsb3AKKyoua2RldioKKworIyBtYWNPUworLkRTX1N0b3JlCisuQXBwbGVEb3VibGUKKy5MU092ZXJyaWRlCisuXyoKKworIyBXYWYgYnVpbGQgc3lzdGVtCisvYnVpbGQvCisud2FmLSotKi8KKy53YWYzLSotKi8KKy5sb2NrLXdhZioKKworIyBDb21waWxlZCBweXRob24gY29kZQorX19weWNhY2hlX18vCisqLnB5W2NvZF0KKworIyBPdGhlcgorL1ZFUlNJT04KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8uamVua2lucyBiLy5qZW5raW5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3NGQ3NTEKLS0tIC9kZXYvbnVsbAorKysgYi8uamVua2lucwpAQCAtMCwwICsxLDEwIEBACisjIS91c3IvYmluL2VudiBiYXNoCitzZXQgLWUKKworRElSPSQoIGNkICIkKCBkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIgKSIgJiYgcHdkICkKKworZm9yIGZpbGUgaW4gIiRESVIiLy5qZW5raW5zLmQvKjsgZG8KKyAgICBbWyAtZiAkZmlsZSAmJiAteCAkZmlsZSBdXSB8fCBjb250aW51ZQorICAgIGVjaG8gIlJ1bjogJGZpbGUiCisgICAgIiRmaWxlIgorZG9uZQpkaWZmIC0tZ2l0IGEvLmplbmtpbnMuZC8wMC1kZXBzLnNoIGIvLmplbmtpbnMuZC8wMC1kZXBzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1YzI0NDcKLS0tIC9kZXYvbnVsbAorKysgYi8uamVua2lucy5kLzAwLWRlcHMuc2gKQEAgLTAsMCArMSwyOSBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorc2V0IC1lCisKK0pESVI9JCggY2QgIiQoIGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IiApIiAmJiBwd2QgKQorc291cmNlICIkSkRJUiIvdXRpbC5zaAorCitzZXQgLXgKKworaWYgaGFzIE9TWCAkTk9ERV9MQUJFTFM7IHRoZW4KKyAgICBGT1JNVUxBRT0oYm9vc3Qgb3BlbnNzbCBwa2ctY29uZmlnKQorICAgIGJyZXcgdXBkYXRlCisgICAgaWYgW1sgLW4gJFRSQVZJUyBdXTsgdGhlbgorICAgICAgICAjIHRyYXZpcyBpbWFnZXMgY29tZSB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIGJyZXcgcGFja2FnZXMKKyAgICAgICAgIyBwcmUtaW5zdGFsbGVkLCBkb24ndCB3YXN0ZSB0aW1lIHVwZ3JhZGluZyBhbGwgb2YgdGhlbQorICAgICAgICBmb3IgRk9STVVMQSBpbiAiJHtGT1JNVUxBRVtAXX0iOyBkbworICAgICAgICAgICAgYnJldyBvdXRkYXRlZCAkRk9STVVMQSB8fCBicmV3IHVwZ3JhZGUgJEZPUk1VTEEKKyAgICAgICAgZG9uZQorICAgIGVsc2UKKyAgICAgICAgYnJldyB1cGdyYWRlCisgICAgZmkKKyAgICBicmV3IGluc3RhbGwgIiR7Rk9STVVMQUVbQF19IgorICAgIGJyZXcgY2xlYW51cAorZmkKKworaWYgaGFzIFVidW50dSAkTk9ERV9MQUJFTFM7IHRoZW4KKyAgICBzdWRvIGFwdC1nZXQgLXFxIHVwZGF0ZQorICAgIHN1ZG8gYXB0LWdldCAtcXkgaW5zdGFsbCBidWlsZC1lc3NlbnRpYWwgcGtnLWNvbmZpZyBsaWJib29zdC1hbGwtZGV2IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlic3FsaXRlMy1kZXYgbGlic3NsLWRldgorZmkKZGlmZiAtLWdpdCBhLy5qZW5raW5zLmQvMDEtbmRuLWN4eC5zaCBiLy5qZW5raW5zLmQvMDEtbmRuLWN4eC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOWUyYTYzCi0tLSAvZGV2L251bGwKKysrIGIvLmplbmtpbnMuZC8wMS1uZG4tY3h4LnNoCkBAIC0wLDAgKzEsNTYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKK3NldCAtZQorCitKRElSPSQoIGNkICIkKCBkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIgKSIgJiYgcHdkICkKK3NvdXJjZSAiJEpESVIiL3V0aWwuc2gKKworc2V0IC14CisKK3B1c2hkICIke0NBQ0hFX0RJUjotL3RtcH0iID4vZGV2L251bGwKKworSU5TVEFMTEVEX1ZFUlNJT049CitpZiBoYXMgT1NYICROT0RFX0xBQkVMUzsgdGhlbgorICAgIEJPT1NUPSQoYnJldyBscyAtLXZlcnNpb25zIGJvb3N0KQorICAgIE9MRF9CT09TVD0kKGNhdCBib29zdC50eHQgfHwgOikKKyAgICBpZiBbWyAkT0xEX0JPT1NUICE9ICRCT09TVCBdXTsgdGhlbgorICAgICAgICBlY2hvICIkQk9PU1QiID4gYm9vc3QudHh0CisgICAgICAgIElOU1RBTExFRF9WRVJTSU9OPU5PTkUKKyAgICBmaQorZmkKKworaWYgW1sgLXogJElOU1RBTExFRF9WRVJTSU9OIF1dOyB0aGVuCisgICAgSU5TVEFMTEVEX1ZFUlNJT049JChnaXQgLUMgbmRuLWN4eCByZXYtcGFyc2UgSEVBRCAyPi9kZXYvbnVsbCB8fCBlY2hvIE5PTkUpCitmaQorCitzdWRvIHJtIC1SZiBuZG4tY3h4LWxhdGVzdAorCitnaXQgY2xvbmUgLS1kZXB0aCAxIGdpdDovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG4tY3h4IG5kbi1jeHgtbGF0ZXN0CisKK0xBVEVTVF9WRVJTSU9OPSQoZ2l0IC1DIG5kbi1jeHgtbGF0ZXN0IHJldi1wYXJzZSBIRUFEIDI+L2Rldi9udWxsIHx8IGVjaG8gVU5LTk9XTikKKworaWYgW1sgJElOU1RBTExFRF9WRVJTSU9OICE9ICRMQVRFU1RfVkVSU0lPTiBdXTsgdGhlbgorICAgIHN1ZG8gcm0gLVJmIG5kbi1jeHgKKyAgICBtdiBuZG4tY3h4LWxhdGVzdCBuZG4tY3h4CitlbHNlCisgICAgc3VkbyBybSAtUmYgbmRuLWN4eC1sYXRlc3QKK2ZpCisKK3N1ZG8gcm0gLWYgL3Vzci9sb2NhbC9iaW4vbmRuc2VjKgorc3VkbyBybSAtZnIgL3Vzci9sb2NhbC9pbmNsdWRlL25kbi1jeHgKK3N1ZG8gcm0gLWYgL3Vzci9sb2NhbC9saWIvbGlibmRuLWN4eCoKK3N1ZG8gcm0gLWYgL3Vzci9sb2NhbC9saWIvcGtnY29uZmlnL2xpYm5kbi1jeHgucGMKKworcHVzaGQgbmRuLWN4eCA+L2Rldi9udWxsCisKKy4vd2FmIGNvbmZpZ3VyZSAtLWNvbG9yPXllcyAtLWVuYWJsZS1zaGFyZWQgLS1kaXNhYmxlLXN0YXRpYyAtLXdpdGhvdXQtb3N4LWtleWNoYWluCisuL3dhZiBidWlsZCAtLWNvbG9yPXllcyAtaiR7V0FGX0pPQlM6LTF9CitzdWRvIGVudiAiUEFUSD0kUEFUSCIgLi93YWYgaW5zdGFsbCAtLWNvbG9yPXllcworCitwb3BkID4vZGV2L251bGwKK3BvcGQgPi9kZXYvbnVsbAorCitpZiBoYXMgTGludXggJE5PREVfTEFCRUxTOyB0aGVuCisgICAgc3VkbyBsZGNvbmZpZworZWxpZiBoYXMgRnJlZUJTRDEwICROT0RFX0xBQkVMUzsgdGhlbgorICAgIHN1ZG8gbGRjb25maWcgLW0KK2ZpCmRpZmYgLS1naXQgYS8uamVua2lucy5kLzEwLWJ1aWxkLnNoIGIvLmplbmtpbnMuZC8xMC1idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZWU1YTc4Ci0tLSAvZGV2L251bGwKKysrIGIvLmplbmtpbnMuZC8xMC1idWlsZC5zaApAQCAtMCwwICsxLDQ2IEBACisjIS91c3IvYmluL2VudiBiYXNoCitzZXQgLWUKKworSkRJUj0kKCBjZCAiJCggZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iICkiICYmIHB3ZCApCitzb3VyY2UgIiRKRElSIi91dGlsLnNoCisKK3NldCAteAorCisjIENsZWFudXAKK3N1ZG8gZW52ICJQQVRIPSRQQVRIIiAuL3dhZiAtLWNvbG9yPXllcyBkaXN0Y2xlYW4KKworaWYgW1sgJEpPQl9OQU1FICE9ICoiY29kZS1jb3ZlcmFnZSIgJiYgJEpPQl9OQU1FICE9ICoibGltaXRlZC1idWlsZCIgXV07IHRoZW4KKyAgIyBDb25maWd1cmUvYnVpbGQgaW4gb3B0aW1pemVkIG1vZGUgd2l0aCB0ZXN0cworICAuL3dhZiAtLWNvbG9yPXllcyBjb25maWd1cmUgLS13aXRoLXRlc3RzCisgIC4vd2FmIC0tY29sb3I9eWVzIGJ1aWxkIC1qJHtXQUZfSk9CUzotMX0KKworICAjIENsZWFudXAKKyAgc3VkbyBlbnYgIlBBVEg9JFBBVEgiIC4vd2FmIC0tY29sb3I9eWVzIGRpc3RjbGVhbgorCisgICMgQ29uZmlndXJlL2J1aWxkIGluIG9wdGltaXplZCBtb2RlIHdpdGhvdXQgdGVzdHMKKyAgLi93YWYgLS1jb2xvcj15ZXMgY29uZmlndXJlCisgIC4vd2FmIC0tY29sb3I9eWVzIGJ1aWxkIC1qJHtXQUZfSk9CUzotMX0KKworICAjIENsZWFudXAKKyAgc3VkbyBlbnYgIlBBVEg9JFBBVEgiIC4vd2FmIC0tY29sb3I9eWVzIGRpc3RjbGVhbgorZmkKKworIyBDb25maWd1cmUvYnVpbGQgaW4gZGVidWcgbW9kZSB3aXRoIHRlc3RzCitpZiBbWyAkSk9CX05BTUUgPT0gKiJjb2RlLWNvdmVyYWdlIiBdXTsgdGhlbgorICAgIENPVkVSQUdFPSItLXdpdGgtY292ZXJhZ2UiCitlbGlmIFtbIC1uICRCVUlMRF9XSVRIX0FTQU4gfHwgLXogJFRSQVZJUyBdXTsgdGhlbgorICAgIEFTQU49Ii0td2l0aC1zYW5pdGl6ZXI9YWRkcmVzcyIKK2ZpCisuL3dhZiAtLWNvbG9yPXllcyBjb25maWd1cmUgLS1kZWJ1ZyAtLXdpdGgtdGVzdHMgJENPVkVSQUdFICRBU0FOCisuL3dhZiAtLWNvbG9yPXllcyBidWlsZCAtaiR7V0FGX0pPQlM6LTF9CisKKyMgKHRlc3RzIHdpbGwgYmUgcnVuIGFnYWluc3QgZGVidWcgdmVyc2lvbikKKworIyBJbnN0YWxsCitzdWRvIGVudiAiUEFUSD0kUEFUSCIgLi93YWYgLS1jb2xvcj15ZXMgaW5zdGFsbAorCitpZiBoYXMgTGludXggJE5PREVfTEFCRUxTOyB0aGVuCisgICAgc3VkbyBsZGNvbmZpZworZWxpZiBoYXMgRnJlZUJTRCAkTk9ERV9MQUJFTFM7IHRoZW4KKyAgICBzdWRvIGxkY29uZmlnIC1hCitmaQpkaWZmIC0tZ2l0IGEvLmplbmtpbnMuZC8yMC10ZXN0cy5zaCBiLy5qZW5raW5zLmQvMjAtdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjU0MTg2NgotLS0gL2Rldi9udWxsCisrKyBiLy5qZW5raW5zLmQvMjAtdGVzdHMuc2gKQEAgLTAsMCArMSw0NyBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorc2V0IC1lCisKK0pESVI9JCggY2QgIiQoIGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IiApIiAmJiBwd2QgKQorc291cmNlICIkSkRJUiIvdXRpbC5zaAorCitzZXQgLXgKKworIyBQcmVwYXJlIGVudmlyb25tZW50CitybSAtUmYgfi8ubmRuCisKK2lmIGhhcyBPU1ggJE5PREVfTEFCRUxTOyB0aGVuCisgICAgc2VjdXJpdHkgdW5sb2NrLWtleWNoYWluIC1wIG5hbWVkLWRhdGEKK2ZpCisKK25kbnNlYy1rZXlnZW4gIi90bXAvamVua2lucy8kTk9ERV9OQU1FIiB8IG5kbnNlYy1pbnN0YWxsLWNlcnQgLQorCitCT09TVF9WRVJTSU9OPSQocHl0aG9uIC1jICJpbXBvcnQgc3lzOyBzeXMucGF0aC5hcHBlbmQoJ2J1aWxkL2M0Y2hlJyk7IGltcG9ydCBfY2FjaGU7IHByaW50KF9jYWNoZS5CT09TVF9WRVJTSU9OX05VTUJFUik7IikKKwordXRfbG9nX2FyZ3MoKSB7CisgICAgaWYgKCggQk9PU1RfVkVSU0lPTiA+PSAxMDYyMDAgKSk7IHRoZW4KKyAgICAgICAgZWNobyAtLWxvZ2dlcj1IUkYsdGVzdF9zdWl0ZSxzdGRvdXQ6WE1MLGFsbCxidWlsZC94dW5pdC0kezE6LXJlcG9ydH0ueG1sCisgICAgZWxzZQorICAgICAgICBpZiBbWyAtbiAkWFVOSVQgXV07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gLS1sb2dfbGV2ZWw9YWxsICQoICgoIEJPT1NUX1ZFUlNJT04gPj0gMTA2MDAwICkpICYmIGVjaG8gLS0gKSBcCisgICAgICAgICAgICAgICAgIC0tbG9nX2Zvcm1hdDI9WE1MIC0tbG9nX3NpbmsyPWJ1aWxkL3h1bml0LSR7MTotcmVwb3J0fS54bWwKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAtLWxvZ19sZXZlbD10ZXN0X3N1aXRlCisgICAgICAgIGZpCisgICAgZmkKK30KKworQVNBTl9PUFRJT05TPSJjb2xvcj1hbHdheXMiCitBU0FOX09QVElPTlMrPSI6ZGV0ZWN0X3N0YWNrX3VzZV9hZnRlcl9yZXR1cm49dHJ1ZSIKK0FTQU5fT1BUSU9OUys9IjpjaGVja19pbml0aWFsaXphdGlvbl9vcmRlcj10cnVlIgorQVNBTl9PUFRJT05TKz0iOnN0cmljdF9pbml0X29yZGVyPXRydWUiCitBU0FOX09QVElPTlMrPSI6ZGV0ZWN0X2ludmFsaWRfcG9pbnRlcl9wYWlycz0xIgorQVNBTl9PUFRJT05TKz0iOmRldGVjdF9jb250YWluZXJfb3ZlcmZsb3c9ZmFsc2UiCitBU0FOX09QVElPTlMrPSI6c3RyaWN0X3N0cmluZ19jaGVja3M9dHJ1ZSIKK0FTQU5fT1BUSU9OUys9IjpzdHJpcF9wYXRoX3ByZWZpeD0ke1BXRH0vIgorZXhwb3J0IEFTQU5fT1BUSU9OUworCitleHBvcnQgQk9PU1RfVEVTVF9DT0xPUl9PVVRQVVQ9InllcyIKK2V4cG9ydCBORE5fTE9HPSIqPURFQlVHIgorCisjIFJ1biB1bml0IHRlc3RzCisuL2J1aWxkL3VuaXQtdGVzdHMgJCh1dF9sb2dfYXJncykKZGlmZiAtLWdpdCBhLy5qZW5raW5zLmQvUkVBRE1FLm1kIGIvLmplbmtpbnMuZC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmYTQwYgotLS0gL2Rldi9udWxsCisrKyBiLy5qZW5raW5zLmQvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzYgQEAKK0NPTlRJTlVPVVMgSU5URUdSQVRJT04gU0NSSVBUUworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0Vudmlyb25tZW50IFZhcmlhYmxlcyBVc2VkIGluIEJ1aWxkIFNjcmlwdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBgTk9ERV9MQUJFTFNgOiB0aGUgdmFyaWFibGUgZGVmaW5lcyBhIGxpc3Qgb2YgT1MgcHJvcGVydGllcy4gIFRoZSBzZXQgdmFsdWVzIGFyZSB1c2VkIGJ5IHRoZQorICBidWlsZCBzY3JpcHRzIHRvIHNlbGVjdCBwcm9wZXIgYmVoYXZpb3IgZm9yIGRpZmZlcmVudCBPUy4KKworICBUaGUgbGlzdCBzaG91bGQgaW5jbHVkZSBhdCBsZWFzdCBgW09TX1RZUEVdYCwgYFtESVNUUk9fVFlQRV1gLCBhbmQgYFtESVNUUk9fVkVSU0lPTl1gLgorCisgIFBvc3NpYmxlIHZhbHVlcyBmb3IgTGludXg6CisKKyAgKiBgW09TX1RZUEVdYDogYExpbnV4YAorICAqIGBbRElTVFJPX1RZUEVdYDogYFVidW50dWAKKyAgKiBgW0RJU1RST19WRVJTSU9OXWA6IGBVYnVudHUtMTYuMDRgLCBgVWJ1bnR1LTE4LjA0YAorCisgIFBvc3NpYmxlIHZhbHVlcyBmb3IgT1MgWCAvIG1hY09TOgorCisgICogYFtPU19UWVBFXWA6IGBPU1hgCisgICogYFtESVNUUk9fVFlQRV1gOiBgT1NYYCAoY2FuIGJlIGFic2VudCkKKyAgKiBgW0RJU1RST19WRVJTSU9OXWA6IGBPU1gtMTAuMTFgLCBgT1NYLTEwLjEyYCwgYE9TWC0xMC4xM2AKKworLSBgSk9CX05BTUVgOiBvcHRpb25hbCB2YXJpYWJsZSB0byBkZWZpbmUgdHlwZSBvZiB0aGUgam9iLiAgRGVwZW5kaW5nIG9uIHRoZSBkZWZpbmVkIGpvYiB0eXBlLAorICB0aGUgYnVpbGQgc2NyaXB0cyBjYW4gcGVyZm9ybSBkaWZmZXJlbnQgdGFza3MuCisKKyAgUG9zc2libGUgdmFsdWVzOgorCisgICogZW1wdHk6IGRlZmF1bHQgYnVpbGQgcHJvY2VzcworICAqIGBjb2RlLWNvdmVyYWdlYCAoTGludXggT1MgaXMgYXNzdW1lZCk6IGRlYnVnIGJ1aWxkIHdpdGggdGVzdHMgYW5kIGNvZGUgY292ZXJhZ2UgYW5hbHlzaXMKKyAgKiBgbGltaXRlZC1idWlsZGA6IG9ubHkgYSBzaW5nbGUgZGVidWcgYnVpbGQgd2l0aCB0ZXN0cworCistIGBDQUNIRV9ESVJgOiB0aGUgdmFyaWFibGUgZGVmaW5lcyBhIHBhdGggdG8gZm9sZGVyIGNvbnRhaW5pbmcgY2FjaGVkIGZpbGVzIGZyb20gcHJldmlvdXMgYnVpbGRzLAorICBlLmcuLCBhIGNvbXBpbGVkIHZlcnNpb24gb2YgbmRuLWN4eCBsaWJyYXJ5LiAgSWYgbm90IHNldCwgYC90bXBgIGlzIHVzZWQuCisKKy0gYFdBRl9KT0JTYDogbnVtYmVyIG9mIHBhcmFsbGVsIGJ1aWxkIGpvYnMgdXNlZCBieSB3YWYsIGRlZmF1bHRzIHRvIDEuCmRpZmYgLS1naXQgYS8uamVua2lucy5kL3V0aWwuc2ggYi8uamVua2lucy5kL3V0aWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5YmMyNwotLS0gL2Rldi9udWxsCisrKyBiLy5qZW5raW5zLmQvdXRpbC5zaApAQCAtMCwwICsxLDE4IEBACitoYXMoKSB7CisgICAgbG9jYWwgc2F2ZWRfeHRyYWNlCisgICAgW1sgJC0gPT0gKngqIF1dICYmIHNhdmVkX3h0cmFjZT0teCB8fCBzYXZlZF94dHJhY2U9K3gKKyAgICBzZXQgK3gKKworICAgIGxvY2FsIHA9JDEKKyAgICBzaGlmdAorICAgIGxvY2FsIGkgcmV0PTEKKyAgICBmb3IgaSBpbiAiJEAiOyBkbworICAgICAgICBpZiBbWyAiJHtpfSIgPT0gIiR7cH0iIF1dOyB0aGVuCisgICAgICAgICAgICByZXQ9MAorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICBkb25lCisKKyAgICBzZXQgJHtzYXZlZF94dHJhY2V9CisgICAgcmV0dXJuICR7cmV0fQorfQpkaWZmIC0tZ2l0IGEvLndhZi10b29scy9ib29zdC5weSBiLy53YWYtdG9vbHMvYm9vc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjY2NmMwotLS0gL2Rldi9udWxsCisrKyBiLy53YWYtdG9vbHMvYm9vc3QucHkKQEAgLTAsMCArMSw1MjIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBlbmNvZGluZzogdXRmLTgKKyMKKyMgcGFydGlhbGx5IGJhc2VkIG9uIGJvb3N0LnB5IHdyaXR0ZW4gYnkgR2Vybm90IFZvcm1heXIKKyMgd3JpdHRlbiBieSBSdWVkaWdlciBTb25kZXJmZWxkIDxydWVkaWdlckBjLXBsdXNwbHVzLmRlPiwgMjAwOAorIyBtb2RpZmllZCBieSBCam9lcm4gTWljaGFlbHNlbiwgMjAwOAorIyBtb2RpZmllZCBieSBMdWNhIEZvc3NhdGksIDIwMDgKKyMgcmV3cml0dGVuIGZvciB3YWYgMS41LjEsIFRob21hcyBOYWd5LCAyMDA4CisjIHJld3JpdHRlbiBmb3Igd2FmIDEuNi4yLCBTeWx2YWluIFJvdXF1ZXR0ZSwgMjAxMQorCisnJycKKworVGhpcyBpcyBhbiBleHRyYSB0b29sLCBub3QgYnVuZGxlZCB3aXRoIHRoZSBkZWZhdWx0IHdhZiBiaW5hcnkuCitUbyBhZGQgdGhlIGJvb3N0IHRvb2wgdG8gdGhlIHdhZiBmaWxlOgorJCAuL3dhZi1saWdodCAtLXRvb2xzPWNvbXBhdDE1LGJvb3N0CisJb3IsIGlmIHlvdSBoYXZlIHdhZiA+PSAxLjYuMgorJCAuL3dhZiB1cGRhdGUgLS1maWxlcz1ib29zdAorCitXaGVuIHVzaW5nIHRoaXMgdG9vbCwgdGhlIHdzY3JpcHQgd2lsbCBsb29rIGxpa2U6CisKKwlkZWYgb3B0aW9ucyhvcHQpOgorCQlvcHQubG9hZCgnY29tcGlsZXJfY3h4IGJvb3N0JykKKworCWRlZiBjb25maWd1cmUoY29uZik6CisJCWNvbmYubG9hZCgnY29tcGlsZXJfY3h4IGJvb3N0JykKKwkJY29uZi5jaGVja19ib29zdChsaWI9J3N5c3RlbSBmaWxlc3lzdGVtJykKKworCWRlZiBidWlsZChibGQpOgorCQlibGQoc291cmNlPSdtYWluLmNwcCcsIHRhcmdldD0nYXBwJywgdXNlPSdCT09TVCcpCisKK09wdGlvbnMgYXJlIGdlbmVyYXRlZCwgaW4gb3JkZXIgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgYm9vc3QgaW5jbHVkZXMvbGlicmFyaWVzLgorVGhlIGBjaGVja19ib29zdGAgY29uZmlndXJhdGlvbiBmdW5jdGlvbiBhbGxvd3MgdG8gc3BlY2lmeSB0aGUgdXNlZCBib29zdCBsaWJyYXJpZXMuCitJdCBjYW4gYWxzbyBwcm92aWRlIGRlZmF1bHQgYXJndW1lbnRzIHRvIHRoZSAtLWJvb3N0LW10IGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCitFdmVyeXRoaW5nIHdpbGwgYmUgcGFja2FnZWQgdG9nZXRoZXIgaW4gYSBCT09TVCBjb21wb25lbnQgdGhhdCB5b3UgY2FuIHVzZS4KKworV2hlbiB1c2luZyBNU1ZDLCBhIGxvdCBvZiBjb21waWxhdGlvbiBmbGFncyBuZWVkIHRvIG1hdGNoIHlvdXIgQk9PU1QgYnVpbGQgY29uZmlndXJhdGlvbjoKKyAtIHlvdSBtYXkgaGF2ZSB0byBhZGQgL0VIc2MgdG8geW91ciBDWFhGTEFHUyBvciBkZWZpbmUgYm9vc3Q6OnRocm93X2V4Y2VwdGlvbiBpZiBCT09TVF9OT19FWENFUFRJT05TIGlzIGRlZmluZWQuCisgICBFcnJvcnM6IEM0NTMwCisgLSBib29zdCBsaWJyYXJpZXMgd2lsbCB0cnkgdG8gYmUgc21hcnQgYW5kIHVzZSB0aGUgKHByZXR0eSBidXQgb2Z0ZW4gbm90IHVzZWZ1bCkgYXV0by1saW5raW5nIGZlYXR1cmUgb2YgTVNWQworICAgU28gYmVmb3JlIGNhbGxpbmcgYGNvbmYuY2hlY2tfYm9vc3RgIHlvdSBtaWdodCB3YW50IHRvIGRpc2FibGluZyBieSBhZGRpbmcKKwkJY29uZi5lbnYuREVGSU5FU19CT09TVCArPSBbJ0JPT1NUX0FMTF9OT19MSUInXQorICAgRXJyb3JzOgorIC0gYm9vc3QgbWlnaHQgYWxzbyBiZSBjb21waWxlZCB3aXRoIC9NVCwgd2hpY2ggbGlua3MgdGhlIHJ1bnRpbWUgc3RhdGljYWxseS4KKyAgIElmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggcmVkZWZpbmVkIHN5bWJvbHMsCisJCXNlbGYuZW52WydERUZJTkVTXyVzJyAlIHZhcl0gKz0gWydCT09TVF9BTExfTk9fTElCJ10KKwkJc2VsZi5lbnZbJ0NYWEZMQUdTXyVzJyAlIHZhcl0gKz0gWycvTUQnLCAnL0VIc2MnXQorUGFzc2luZyBgLS1ib29zdC1saW5rYWdlX2F1dG9kZXRlY3RgIG1pZ2h0IGhlbHAgZW5zdXJpbmcgaGF2aW5nIGEgY29ycmVjdCBsaW5rYWdlIGluIHNvbWUgYmFzaWMgY2FzZXMuCisKKycnJworCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2Zyb20gd2FmbGliIGltcG9ydCBVdGlscywgTG9ncywgRXJyb3JzCitmcm9tIHdhZmxpYi5Db25maWd1cmUgaW1wb3J0IGNvbmYKK2Zyb20gd2FmbGliLlRhc2tHZW4gaW1wb3J0IGZlYXR1cmUsIGFmdGVyX21ldGhvZAorCitCT09TVF9MSUJTID0gWycvdXNyL2xpYicsICcvdXNyL2xvY2FsL2xpYicsICcvb3B0L2xvY2FsL2xpYicsICcvc3cvbGliJywgJy9saWInXQorQk9PU1RfSU5DTFVERVMgPSBbJy91c3IvaW5jbHVkZScsICcvdXNyL2xvY2FsL2luY2x1ZGUnLCAnL29wdC9sb2NhbC9pbmNsdWRlJywgJy9zdy9pbmNsdWRlJ10KK0JPT1NUX1ZFUlNJT05fRklMRSA9ICdib29zdC92ZXJzaW9uLmhwcCcKK0JPT1NUX1ZFUlNJT05fQ09ERSA9ICcnJworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgoraW50IG1haW4oKSB7IHN0ZDo6Y291dCA8PCBCT09TVF9MSUJfVkVSU0lPTiA8PCAiOiIgPDwgQk9PU1RfVkVSU0lPTiA8PCBzdGQ6OmVuZGw7IH0KKycnJworCitCT09TVF9FUlJPUl9DT0RFID0gJycnCisjaW5jbHVkZSA8Ym9vc3Qvc3lzdGVtL2Vycm9yX2NvZGUuaHBwPgoraW50IG1haW4oKSB7IGJvb3N0OjpzeXN0ZW06OmVycm9yX2NvZGUgYzsgfQorJycnCisKK1BUSFJFQURfQ09ERSA9ICcnJworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK3N0YXRpYyB2b2lkKiBmKHZvaWQqKSB7IHJldHVybiAwOyB9CitpbnQgbWFpbigpIHsKKwlwdGhyZWFkX3QgdGg7CisJcHRocmVhZF9hdHRyX3QgYXR0cjsKKwlwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisJcHRocmVhZF9jcmVhdGUoJnRoLCAmYXR0ciwgJmYsIDApOworCXB0aHJlYWRfam9pbih0aCwgMCk7CisJcHRocmVhZF9jbGVhbnVwX3B1c2goMCwgMCk7CisJcHRocmVhZF9jbGVhbnVwX3BvcCgwKTsKKwlwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7Cit9CisnJycKKworQk9PU1RfVEhSRUFEX0NPREUgPSAnJycKKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgoraW50IG1haW4oKSB7IGJvb3N0Ojp0aHJlYWQgdDsgfQorJycnCisKK0JPT1NUX0xPR19DT0RFID0gJycnCisjaW5jbHVkZSA8Ym9vc3QvbG9nL3RyaXZpYWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2xvZy91dGlsaXR5L3NldHVwL2NvbnNvbGUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2xvZy91dGlsaXR5L3NldHVwL2NvbW1vbl9hdHRyaWJ1dGVzLmhwcD4KK2ludCBtYWluKCkgeworCXVzaW5nIG5hbWVzcGFjZSBib29zdDo6bG9nOworCWFkZF9jb21tb25fYXR0cmlidXRlcygpOworCWFkZF9jb25zb2xlX2xvZyhzdGQ6OmNsb2csIGtleXdvcmRzOjpmb3JtYXQgPSAiJU1lc3NhZ2UlIik7CisJQk9PU1RfTE9HX1RSSVZJQUwoZGVidWcpIDw8ICJsb2cgaXMgd29ya2luZyIgPDwgc3RkOjplbmRsOworfQorJycnCisKKyMgdG9vbHNldHMgZnJvbSB7Ym9vc3RfZGlyfS90b29scy9idWlsZC92Mi90b29scy9jb21tb24uamFtCitQTEFURk9STSA9IFV0aWxzLnVudmVyc2lvbmVkX3N5c19wbGF0Zm9ybSgpCitkZXRlY3RfaW50ZWwgPSBsYW1iZGEgZW52OiAoUExBVEZPUk0gPT0gJ3dpbjMyJykgYW5kICdpdycgb3IgJ2lsJworZGV0ZWN0X2NsYW5nID0gbGFtYmRhIGVudjogKFBMQVRGT1JNID09ICdkYXJ3aW4nKSBhbmQgJ2NsYW5nLWRhcndpbicgb3IgJ2NsYW5nJworZGV0ZWN0X21pbmd3ID0gbGFtYmRhIGVudjogKHJlLnNlYXJjaCgnTWluR1cnLCBlbnYuQ1hYWzBdKSkgYW5kICdtZ3cnIG9yICdnY2MnCitCT09TVF9UT09MU0VUUyA9IHsKKwknYm9ybGFuZCc6ICAnYmNiJywKKwknY2xhbmcnOglkZXRlY3RfY2xhbmcsCisJJ2NvbW8nOgkgJ2NvbW8nLAorCSdjdyc6CSAgICdjdycsCisJJ2Rhcndpbic6ICAgJ3hnY2MnLAorCSdlZGcnOgkgICdlZGcnLAorCSdnKysnOgkgIGRldGVjdF9taW5ndywKKwknZ2NjJzoJICBkZXRlY3RfbWluZ3csCisJJ2ljcGMnOgkgZGV0ZWN0X2ludGVsLAorCSdpbnRlbCc6CWRldGVjdF9pbnRlbCwKKwkna2NjJzoJICAna2NjJywKKwkna3lsaXgnOgknYmNrJywKKwknbWlwc3Bybyc6ICAnbXAnLAorCSdtaW5ndyc6CSdtZ3cnLAorCSdtc3ZjJzoJICd2YycsCisJJ3FjYyc6CSAgJ3FjYycsCisJJ3N1bic6CSAgJ3N3JywKKwknc3VuYysrJzogICAnc3cnLAorCSd0cnU2NGN4eCc6ICd0cnUnLAorCSd2YWNwcCc6CSd4bGMnCit9CisKKworZGVmIG9wdGlvbnMob3B0KToKKwlvcHQgPSBvcHQuYWRkX29wdGlvbl9ncm91cCgnQm9vc3QgT3B0aW9ucycpCisJb3B0LmFkZF9vcHRpb24oJy0tYm9vc3QtaW5jbHVkZXMnLCB0eXBlPSdzdHJpbmcnLAorCQkJCSAgIGRlZmF1bHQ9JycsIGRlc3Q9J2Jvb3N0X2luY2x1ZGVzJywKKwkJCQkgICBoZWxwPScnJ3BhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgYm9vc3QgaW5jbHVkZXMgYXJlLAorCQkJCSAgIGUuZy4sIC9wYXRoL3RvL2Jvb3N0XzFfNTVfMC9zdGFnZS9pbmNsdWRlJycnKQorCW9wdC5hZGRfb3B0aW9uKCctLWJvb3N0LWxpYnMnLCB0eXBlPSdzdHJpbmcnLAorCQkJCSAgIGRlZmF1bHQ9JycsIGRlc3Q9J2Jvb3N0X2xpYnMnLAorCQkJCSAgIGhlbHA9JycncGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBib29zdCBsaWJzIGFyZSwKKwkJCQkgICBlLmcuLCBwYXRoL3RvL2Jvb3N0XzFfNTVfMC9zdGFnZS9saWInJycpCisJb3B0LmFkZF9vcHRpb24oJy0tYm9vc3QtbXQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorCQkJCSAgIGRlZmF1bHQ9RmFsc2UsIGRlc3Q9J2Jvb3N0X210JywKKwkJCQkgICBoZWxwPSdzZWxlY3QgbXVsdGktdGhyZWFkZWQgbGlicmFyaWVzJykKKwlvcHQuYWRkX29wdGlvbignLS1ib29zdC1hYmknLCB0eXBlPSdzdHJpbmcnLCBkZWZhdWx0PScnLCBkZXN0PSdib29zdF9hYmknLAorCQkJCSAgIGhlbHA9Jycnc2VsZWN0IGxpYnJhcmllcyB3aXRoIHRhZ3MgKGdkIGZvciBkZWJ1Zywgc3RhdGljIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQpLAorCQkJCSAgIHNlZSBkb2MgQm9vc3QsIEdldHRpbmcgU3RhcnRlZCwgY2hhcHRlciA2LjEnJycpCisJb3B0LmFkZF9vcHRpb24oJy0tYm9vc3QtbGlua2FnZV9hdXRvZGV0ZWN0JywgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0nYm9vc3RfbGlua2FnZV9hdXRvZGV0ZWN0JywKKwkJCQkgICBoZWxwPSJhdXRvLWRldGVjdCBib29zdCBsaW5rYWdlIG9wdGlvbnMgKGRvbid0IGdldCB1c2VkIHRvIGl0IC8gbWlnaHQgYnJlYWsgb3RoZXIgc3R1ZmYpIikKKwlvcHQuYWRkX29wdGlvbignLS1ib29zdC10b29sc2V0JywgdHlwZT0nc3RyaW5nJywKKwkJCQkgICBkZWZhdWx0PScnLCBkZXN0PSdib29zdF90b29sc2V0JywKKwkJCQkgICBoZWxwPSdmb3JjZSBhIHRvb2xzZXQgZS5nLiBtc3ZjLCB2YzkwLCBcCisJCQkJCQlnY2MsIG1pbmd3LCBtZ3c0NSAoZGVmYXVsdDogYXV0byknKQorCXB5X3ZlcnNpb24gPSAnJWQlZCcgJSAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXSkKKwlvcHQuYWRkX29wdGlvbignLS1ib29zdC1weXRob24nLCB0eXBlPSdzdHJpbmcnLAorCQkJCSAgIGRlZmF1bHQ9cHlfdmVyc2lvbiwgZGVzdD0nYm9vc3RfcHl0aG9uJywKKwkJCQkgICBoZWxwPSdzZWxlY3QgdGhlIGxpYiBweXRob24gd2l0aCB0aGlzIHZlcnNpb24gXAorCQkJCQkJKGRlZmF1bHQ6ICVzKScgJSBweV92ZXJzaW9uKQorCisKK0Bjb25mCitkZWYgX19ib29zdF9nZXRfdmVyc2lvbl9maWxlKHNlbGYsIGQpOgorCWlmIG5vdCBkOgorCQlyZXR1cm4gTm9uZQorCWRub2RlID0gc2VsZi5yb290LmZpbmRfZGlyKGQpCisJaWYgZG5vZGU6CisJCXJldHVybiBkbm9kZS5maW5kX25vZGUoQk9PU1RfVkVSU0lPTl9GSUxFKQorCXJldHVybiBOb25lCisKK0Bjb25mCitkZWYgYm9vc3RfZ2V0X3ZlcnNpb24oc2VsZiwgZCk6CisJIiIic2lsZW50bHkgcmV0cmlldmUgdGhlIGJvb3N0IHZlcnNpb24gbnVtYmVyIiIiCisJbm9kZSA9IHNlbGYuX19ib29zdF9nZXRfdmVyc2lvbl9maWxlKGQpCisJaWYgbm9kZToKKwkJdHJ5OgorCQkJdHh0ID0gbm9kZS5yZWFkKCkKKwkJZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CisJCQlMb2dzLmVycm9yKCJDb3VsZCBub3QgcmVhZCB0aGUgZmlsZSAlciIgJSBub2RlLmFic3BhdGgoKSkKKwkJZWxzZToKKwkJCXJlX2J1dDEgPSByZS5jb21waWxlKCdeI2RlZmluZVxccytCT09TVF9MSUJfVkVSU0lPTlxccysiKC4rKSInLCByZS5NKQorCQkJbTEgPSByZV9idXQxLnNlYXJjaCh0eHQpCisJCQlyZV9idXQyID0gcmUuY29tcGlsZSgnXiNkZWZpbmVcXHMrQk9PU1RfVkVSU0lPTlxccysoXFxkKyknLCByZS5NKQorCQkJbTIgPSByZV9idXQyLnNlYXJjaCh0eHQpCisJCQlpZiBtMSBhbmQgbTI6CisJCQkJcmV0dXJuIChtMS5ncm91cCgxKSwgbTIuZ3JvdXAoMSkpCisJcmV0dXJuIHNlbGYuY2hlY2tfY3h4KGZyYWdtZW50PUJPT1NUX1ZFUlNJT05fQ09ERSwgaW5jbHVkZXM9W2RdLCBleGVjdXRlPVRydWUsIGRlZmluZV9yZXQ9VHJ1ZSkuc3BsaXQoIjoiKQorCitAY29uZgorZGVmIGJvb3N0X2dldF9pbmNsdWRlcyhzZWxmLCAqaywgKiprdyk6CisJaW5jbHVkZXMgPSBrIGFuZCBrWzBdIG9yIGt3LmdldCgnaW5jbHVkZXMnLCBOb25lKQorCWlmIGluY2x1ZGVzIGFuZCBzZWxmLl9fYm9vc3RfZ2V0X3ZlcnNpb25fZmlsZShpbmNsdWRlcyk6CisJCXJldHVybiBpbmNsdWRlcworCWZvciBkIGluIHNlbGYuZW52aXJvbi5nZXQoJ0lOQ0xVREUnLCAnJykuc3BsaXQoJzsnKSArIEJPT1NUX0lOQ0xVREVTOgorCQlpZiBzZWxmLl9fYm9vc3RfZ2V0X3ZlcnNpb25fZmlsZShkKToKKwkJCXJldHVybiBkCisJaWYgaW5jbHVkZXM6CisJCXNlbGYuZW5kX21zZygnaGVhZGVycyBub3QgZm91bmQgaW4gJXMnICUgaW5jbHVkZXMpCisJCXNlbGYuZmF0YWwoJ1RoZSBjb25maWd1cmF0aW9uIGZhaWxlZCcpCisJZWxzZToKKwkJc2VsZi5lbmRfbXNnKCdoZWFkZXJzIG5vdCBmb3VuZCwgcGxlYXNlIHByb3ZpZGUgYSAtLWJvb3N0LWluY2x1ZGVzIGFyZ3VtZW50IChzZWUgaGVscCknKQorCQlzZWxmLmZhdGFsKCdUaGUgY29uZmlndXJhdGlvbiBmYWlsZWQnKQorCisKK0Bjb25mCitkZWYgYm9vc3RfZ2V0X3Rvb2xzZXQoc2VsZiwgY2MpOgorCXRvb2xzZXQgPSBjYworCWlmIG5vdCBjYzoKKwkJYnVpbGRfcGxhdGZvcm0gPSBVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKQorCQlpZiBidWlsZF9wbGF0Zm9ybSBpbiBCT09TVF9UT09MU0VUUzoKKwkJCWNjID0gYnVpbGRfcGxhdGZvcm0KKwkJZWxzZToKKwkJCWNjID0gc2VsZi5lbnYuQ1hYX05BTUUKKwlpZiBjYyBpbiBCT09TVF9UT09MU0VUUzoKKwkJdG9vbHNldCA9IEJPT1NUX1RPT0xTRVRTW2NjXQorCXJldHVybiBpc2luc3RhbmNlKHRvb2xzZXQsIHN0cikgYW5kIHRvb2xzZXQgb3IgdG9vbHNldChzZWxmLmVudikKKworCitAY29uZgorZGVmIF9fYm9vc3RfZ2V0X2xpYnNfcGF0aChzZWxmLCAqaywgKiprdyk6CisJJycnIHJldHVybiB0aGUgbGliIHBhdGggYW5kIGFsbCB0aGUgZmlsZXMgaW4gaXQgJycnCisJaWYgJ2ZpbGVzJyBpbiBrdzoKKwkJcmV0dXJuIHNlbGYucm9vdC5maW5kX2RpcignLicpLCBVdGlscy50b19saXN0KGt3WydmaWxlcyddKQorCWxpYnMgPSBrIGFuZCBrWzBdIG9yIGt3LmdldCgnbGlicycsIE5vbmUpCisJaWYgbGliczoKKwkJcGF0aCA9IHNlbGYucm9vdC5maW5kX2RpcihsaWJzKQorCQlmaWxlcyA9IHBhdGguYW50X2dsb2IoJypib29zdF8qJykKKwlpZiBub3QgbGlicyBvciBub3QgZmlsZXM6CisJCWZvciBkIGluIHNlbGYuZW52aXJvbi5nZXQoJ0xJQicsICcnKS5zcGxpdCgnOycpICsgQk9PU1RfTElCUzoKKwkJCWlmIG5vdCBkOgorCQkJCWNvbnRpbnVlCisJCQlwYXRoID0gc2VsZi5yb290LmZpbmRfZGlyKGQpCisJCQlpZiBwYXRoOgorCQkJCWZpbGVzID0gcGF0aC5hbnRfZ2xvYignKmJvb3N0XyonKQorCQkJCWlmIGZpbGVzOgorCQkJCQlicmVhaworCQkJcGF0aCA9IHNlbGYucm9vdC5maW5kX2RpcihkICsgJzY0JykKKwkJCWlmIHBhdGg6CisJCQkJZmlsZXMgPSBwYXRoLmFudF9nbG9iKCcqYm9vc3RfKicpCisJCQkJaWYgZmlsZXM6CisJCQkJCWJyZWFrCisJaWYgbm90IHBhdGg6CisJCWlmIGxpYnM6CisJCQlzZWxmLmVuZF9tc2coJ2xpYnMgbm90IGZvdW5kIGluICVzJyAlIGxpYnMpCisJCQlzZWxmLmZhdGFsKCdUaGUgY29uZmlndXJhdGlvbiBmYWlsZWQnKQorCQllbHNlOgorCQkJc2VsZi5lbmRfbXNnKCdsaWJzIG5vdCBmb3VuZCwgcGxlYXNlIHByb3ZpZGUgYSAtLWJvb3N0LWxpYnMgYXJndW1lbnQgKHNlZSBoZWxwKScpCisJCQlzZWxmLmZhdGFsKCdUaGUgY29uZmlndXJhdGlvbiBmYWlsZWQnKQorCisJc2VsZi50b19sb2coJ0ZvdW5kIHRoZSBib29zdCBwYXRoIGluICVyIHdpdGggdGhlIGxpYnJhcmllczonICUgcGF0aCkKKwlmb3IgeCBpbiBmaWxlczoKKwkJc2VsZi50b19sb2coJyAgICAlcicgJSB4KQorCXJldHVybiBwYXRoLCBmaWxlcworCitAY29uZgorZGVmIGJvb3N0X2dldF9saWJzKHNlbGYsICprLCAqKmt3KToKKwknJycKKwlyZXR1cm4gdGhlIGxpYiBwYXRoIGFuZCB0aGUgcmVxdWlyZWQgbGlicworCWFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycworCScnJworCXBhdGgsIGZpbGVzID0gc2VsZi5fX2Jvb3N0X2dldF9saWJzX3BhdGgoKiprdykKKwlmaWxlcyA9IHNvcnRlZChmaWxlcywga2V5PWxhbWJkYSBmOiAobGVuKGYubmFtZSksIGYubmFtZSksIHJldmVyc2U9VHJ1ZSkKKwl0b29sc2V0ID0gc2VsZi5ib29zdF9nZXRfdG9vbHNldChrdy5nZXQoJ3Rvb2xzZXQnLCAnJykpCisJdG9vbHNldF9wYXQgPSAnKC0lc1swLTldezAsM30pJyAlIHRvb2xzZXQKKwl2ZXJzaW9uID0gJy0lcycgJSBzZWxmLmVudi5CT09TVF9WRVJTSU9OCisKKwlkZWYgZmluZF9saWIocmVfbGliLCBmaWxlcyk6CisJCWZvciBmaWxlIGluIGZpbGVzOgorCQkJaWYgcmVfbGliLnNlYXJjaChmaWxlLm5hbWUpOgorCQkJCXNlbGYudG9fbG9nKCdGb3VuZCBib29zdCBsaWIgJXMnICUgZmlsZSkKKwkJCQlyZXR1cm4gZmlsZQorCQlyZXR1cm4gTm9uZQorCisJZGVmIGZvcm1hdF9saWJfbmFtZShuYW1lKToKKwkJaWYgbmFtZS5zdGFydHN3aXRoKCdsaWInKSBhbmQgc2VsZi5lbnYuQ0NfTkFNRSAhPSAnbXN2Yyc6CisJCQluYW1lID0gbmFtZVszOl0KKwkJcmV0dXJuIG5hbWVbOm5hbWUucmZpbmQoJy4nKV0KKworCWRlZiBtYXRjaF9saWJzKGxpYl9uYW1lcywgaXNfc3RhdGljKToKKwkJbGlicyA9IFtdCisJCWxpYl9uYW1lcyA9IFV0aWxzLnRvX2xpc3QobGliX25hbWVzKQorCQlpZiBub3QgbGliX25hbWVzOgorCQkJcmV0dXJuIGxpYnMKKwkJdCA9IFtdCisJCWlmIGt3LmdldCgnbXQnLCBGYWxzZSk6CisJCQl0LmFwcGVuZCgnLW10JykKKwkJaWYga3cuZ2V0KCdhYmknLCBOb25lKToKKwkJCXQuYXBwZW5kKCclcyVzJyAlIChpc19zdGF0aWMgYW5kICctcycgb3IgJy0nLCBrd1snYWJpJ10pKQorCQllbGlmIGlzX3N0YXRpYzoKKwkJCXQuYXBwZW5kKCctcycpCisJCXRhZ3NfcGF0ID0gdCBhbmQgJycuam9pbih0KSBvciAnJworCQlleHQgPSBpc19zdGF0aWMgYW5kIHNlbGYuZW52LmN4eHN0bGliX1BBVFRFUk4gb3Igc2VsZi5lbnYuY3h4c2hsaWJfUEFUVEVSTgorCQlleHQgPSBleHQucGFydGl0aW9uKCclcycpWzJdICMgcmVtb3ZlICclcycgb3IgJ2xpYiVzJyBmcm9tIFBBVFRFUk4KKworCQlmb3IgbGliIGluIGxpYl9uYW1lczoKKwkJCWlmIGxpYiA9PSAncHl0aG9uJzoKKwkJCQkjIGZvciBpbnN0YW5jZSwgd2l0aCBweXRob249JzI3JywKKwkJCQkjIGFjY2VwdHMgJy1weTI3JywgJy1weTInLCAnMjcnIGFuZCAnMicKKwkJCQkjIGJ1dCB3aWxsIHJlamVjdCAnLXB5MycsICctcHkyNicsICcyNicgYW5kICczJworCQkJCXRhZ3MgPSAnKHswfSk/KCgtcHl7Mn0pfCgtcHl7MX0oPz1bXjAtOV0pKXwoezJ9KXwoezF9KD89W14wLTldKSl8KD89W14wLTldKSg/IS1weSkpJy5mb3JtYXQodGFnc19wYXQsIGt3WydweXRob24nXVswXSwga3dbJ3B5dGhvbiddKQorCQkJZWxzZToKKwkJCQl0YWdzID0gdGFnc19wYXQKKwkJCSMgVHJ5aW5nIGxpYnJhcmllcywgZnJvbSBtb3N0IHN0cmljdCBtYXRjaCB0byBsZWFzdCBvbmUKKwkJCWZvciBwYXR0ZXJuIGluIFsnYm9vc3RfJXMlcyVzJXMlcyQnICUgKGxpYiwgdG9vbHNldF9wYXQsIHRhZ3MsIHZlcnNpb24sIGV4dCksCisJCQkJCQkJJ2Jvb3N0XyVzJXMlcyVzJCcgJSAobGliLCB0YWdzLCB2ZXJzaW9uLCBleHQpLAorCQkJCQkJCSMgR2l2ZSB1cCB0cnlpbmcgdG8gZmluZCB0aGUgcmlnaHQgdmVyc2lvbgorCQkJCQkJCSdib29zdF8lcyVzJXMlcyQnICUgKGxpYiwgdG9vbHNldF9wYXQsIHRhZ3MsIGV4dCksCisJCQkJCQkJJ2Jvb3N0XyVzJXMlcyQnICUgKGxpYiwgdGFncywgZXh0KSwKKwkJCQkJCQknYm9vc3RfJXMlcyQnICUgKGxpYiwgZXh0KSwKKwkJCQkJCQknYm9vc3RfJXMnICUgbGliXToKKwkJCQlzZWxmLnRvX2xvZygnVHJ5aW5nIHBhdHRlcm4gJXMnICUgcGF0dGVybikKKwkJCQlmaWxlID0gZmluZF9saWIocmUuY29tcGlsZShwYXR0ZXJuKSwgZmlsZXMpCisJCQkJaWYgZmlsZToKKwkJCQkJbGlicy5hcHBlbmQoZm9ybWF0X2xpYl9uYW1lKGZpbGUubmFtZSkpCisJCQkJCWJyZWFrCisJCQllbHNlOgorCQkJCXNlbGYuZW5kX21zZygnbGliICVzIG5vdCBmb3VuZCBpbiAlcycgJSAobGliLCBwYXRoLmFic3BhdGgoKSkpCisJCQkJc2VsZi5mYXRhbCgnVGhlIGNvbmZpZ3VyYXRpb24gZmFpbGVkJykKKwkJcmV0dXJuIGxpYnMKKworCXJldHVybiAgcGF0aC5hYnNwYXRoKCksIG1hdGNoX2xpYnMoa3cuZ2V0KCdsaWInLCBOb25lKSwgRmFsc2UpLCBtYXRjaF9saWJzKGt3LmdldCgnc3RsaWInLCBOb25lKSwgVHJ1ZSkKKworQGNvbmYKK2RlZiBfY2hlY2tfcHRocmVhZF9mbGFnKHNlbGYsICprLCAqKmt3KToKKwknJycKKwlDb21wdXRlcyB3aGljaCBmbGFncyBzaG91bGQgYmUgYWRkZWQgdG8gQ1hYRkxBR1MgYW5kIExJTktGTEFHUyB0byBjb21waWxlIGluIG11bHRpLXRocmVhZGluZyBtb2RlCisKKwlZZXMsIHdlICpuZWVkKiB0byBwdXQgdGhlIC1wdGhyZWFkIHRoaW5nIGluIENQUEZMQUdTIGJlY2F1c2Ugd2l0aCBHQ0MzLAorCWJvb3N0L3RocmVhZC5ocHAgd2lsbCB0cmlnZ2VyIGEgI2Vycm9yIGlmIC1wdGhyZWFkIGlzbid0IHVzZWQ6CisJICBib29zdC9jb25maWcvcmVxdWlyZXNfdGhyZWFkcy5ocHA6NDc6NTogI2Vycm9yICJDb21waWxlciB0aHJlYWRpbmcgc3VwcG9ydAorCSAgaXMgbm90IHR1cm5lZCBvbi4gUGxlYXNlIHNldCB0aGUgY29ycmVjdCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IKKwkgIHRocmVhZGluZzogLXB0aHJlYWQgKExpbnV4KSwgLXB0aHJlYWRzIChTb2xhcmlzKSBvciAtbXRocmVhZHMgKE1pbmd3MzIpIgorCisJQmFzZWQgb24gX0JPT1NUX1BUSFJFQURfRkxBRygpOiBodHRwczovL2dpdGh1Yi5jb20vdHN1bmEvYm9vc3QubTQvYmxvYi9tYXN0ZXIvYnVpbGQtYXV4L2Jvb3N0Lm00CisgICAgJycnCisKKwl2YXIgPSBrdy5nZXQoJ3VzZWxpYl9zdG9yZScsICdCT09TVCcpCisKKwlzZWxmLnN0YXJ0X21zZygnQ2hlY2tpbmcgdGhlIGZsYWdzIG5lZWRlZCB0byB1c2UgcHRocmVhZHMnKQorCisJIyBUaGUgb3JkZXJpbmcgKmlzKiAoc29tZXRpbWVzKSBpbXBvcnRhbnQuICBTb21lIG5vdGVzIG9uIHRoZQorCSMgaW5kaXZpZHVhbCBpdGVtcyBmb2xsb3c6CisJIyAobm9uZSk6IGluIGNhc2UgdGhyZWFkcyBhcmUgaW4gbGliYzsgc2hvdWxkIGJlIHRyaWVkIGJlZm9yZSAtS3RocmVhZCBhbmQKKwkjICAgICAgIG90aGVyIGNvbXBpbGVyIGZsYWdzIHRvIHByZXZlbnQgY29udGludWFsIGNvbXBpbGVyIHdhcm5pbmdzCisJIyAtbHB0aHJlYWRzOiBBSVggKG11c3QgY2hlY2sgdGhpcyBiZWZvcmUgLWxwdGhyZWFkKQorCSMgLUt0aHJlYWQ6IFNlcXVlbnQgKHRocmVhZHMgaW4gbGliYywgYnV0IC1LdGhyZWFkIG5lZWRlZCBmb3IgcHRocmVhZC5oKQorCSMgLWt0aHJlYWQ6IEZyZWVCU0Qga2VybmVsIHRocmVhZHMgKHByZWZlcnJlZCB0byAtcHRocmVhZCBzaW5jZSBTTVAtYWJsZSkKKwkjIC1sbHRocmVhZDogTGludXhUaHJlYWRzIHBvcnQgb24gRnJlZUJTRCAoYWxzbyBwcmVmZXJyZWQgdG8gLXB0aHJlYWQpCisJIyAtcHRocmVhZDogR05VIExpbnV4L0dDQyAoa2VybmVsIHRocmVhZHMpLCBCU0QvR0NDICh1c2VybGFuZCB0aHJlYWRzKQorCSMgLXB0aHJlYWRzOiBTb2xhcmlzL0dDQworCSMgLW10aHJlYWRzOiBNaW5HVzMyL0dDQywgTHlueC9HQ0MKKwkjIC1tdDogU3VuIFdvcmtzaG9wIEMgKG1heSBvbmx5IGxpbmsgU3VuT1MgdGhyZWFkcyBbLWx0aHJlYWRdLCBidXQgaXQKKwkjICAgICAgZG9lc24ndCBodXJ0IHRvIGNoZWNrIHNpbmNlIHRoaXMgc29tZXRpbWVzIGRlZmluZXMgcHRocmVhZHMgdG9vOworCSMgICAgICBhbHNvIGRlZmluZXMgLURfUkVFTlRSQU5UKQorCSMgICAgICAuLi4gLW10IGlzIGFsc28gdGhlIHB0aHJlYWRzIGZsYWcgZm9yIEhQL2FDQworCSMgLWxwdGhyZWFkOiBHTlUgTGludXgsIGV0Yy4KKwkjIC0tdGhyZWFkLXNhZmU6IEtBSSBDKysKKwlpZiBVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKSA9PSAic3Vub3MiOgorCQkjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorCQkjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisJCSMgdGVzdHMgd2lsbCBlcnJvbmVvdXNseSBzdWNjZWVkLiAgKFdlIG5lZWQgdG8gbGluayB3aXRoIC1wdGhyZWFkcy8tbXQvCisJCSMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorCQkjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKwkJIyB3aG8ga25vd3Mgd2hldGhlciB0aGV5J2xsIHN0dWIgdGhhdCB0b28gaW4gYSBmdXR1cmUgbGliYy4pICBTbywKKwkJIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorCQlib29zdF9wdGhyZWFkX2ZsYWdzID0gWyItcHRocmVhZHMiLCAiLWxwdGhyZWFkIiwgIi1tdCIsICItcHRocmVhZCJdCisJZWxzZToKKwkJYm9vc3RfcHRocmVhZF9mbGFncyA9IFsiIiwgIi1scHRocmVhZHMiLCAiLUt0aHJlYWQiLCAiLWt0aHJlYWQiLCAiLWxsdGhyZWFkIiwgIi1wdGhyZWFkIiwKKwkJCQkJCQkgICAiLXB0aHJlYWRzIiwgIi1tdGhyZWFkcyIsICItbHB0aHJlYWQiLCAiLS10aHJlYWQtc2FmZSIsICItbXQiXQorCisJZm9yIGJvb3N0X3B0aHJlYWRfZmxhZyBpbiBib29zdF9wdGhyZWFkX2ZsYWdzOgorCQl0cnk6CisJCQlzZWxmLmVudi5zdGFzaCgpCisJCQlzZWxmLmVudlsnQ1hYRkxBR1NfJXMnICUgdmFyXSArPSBbYm9vc3RfcHRocmVhZF9mbGFnXQorCQkJc2VsZi5lbnZbJ0xJTktGTEFHU18lcycgJSB2YXJdICs9IFtib29zdF9wdGhyZWFkX2ZsYWddCisJCQlzZWxmLmNoZWNrX2N4eChjb2RlPVBUSFJFQURfQ09ERSwgbXNnPU5vbmUsIHVzZT12YXIsIGV4ZWN1dGU9RmFsc2UpCisKKwkJCXNlbGYuZW5kX21zZyhib29zdF9wdGhyZWFkX2ZsYWcpCisJCQlyZXR1cm4KKwkJZXhjZXB0IHNlbGYuZXJyb3JzLkNvbmZpZ3VyYXRpb25FcnJvcjoKKwkJCXNlbGYuZW52LnJldmVydCgpCisJc2VsZi5lbmRfbXNnKCdOb25lJykKKworQGNvbmYKK2RlZiBjaGVja19ib29zdChzZWxmLCAqaywgKiprdyk6CisJIiIiCisJSW5pdGlhbGl6ZSBib29zdCBsaWJyYXJpZXMgdG8gYmUgdXNlZC4KKworCUtleXdvcmRzOiB5b3UgY2FuIHBhc3MgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB3aXRoIHRoZSBjb21tYW5kIGxpbmUgKHdpdGhvdXQgIi0tYm9vc3QtIikuCisJTm90ZSB0aGF0IHRoZSBjb21tYW5kIGxpbmUgaGFzIHRoZSBwcmlvcml0eSwgYW5kIHNob3VsZCBwcmVmZXJhYmx5IGJlIHVzZWQuCisJIiIiCisJaWYgbm90IHNlbGYuZW52WydDWFgnXToKKwkJc2VsZi5mYXRhbCgnbG9hZCBhIGMrKyBjb21waWxlciBmaXJzdCwgY29uZi5sb2FkKCJjb21waWxlcl9jeHgiKScpCisKKwlwYXJhbXMgPSB7CisJCSdsaWInOiBrIGFuZCBrWzBdIG9yIGt3LmdldCgnbGliJywgTm9uZSksCisJCSdzdGxpYic6IGt3LmdldCgnc3RsaWInLCBOb25lKQorCX0KKwlmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLm9wdGlvbnMuX19kaWN0X18uaXRlbXMoKToKKwkJaWYgbm90IGtleS5zdGFydHN3aXRoKCdib29zdF8nKToKKwkJCWNvbnRpbnVlCisJCWtleSA9IGtleVtsZW4oJ2Jvb3N0XycpOl0KKwkJcGFyYW1zW2tleV0gPSB2YWx1ZSBhbmQgdmFsdWUgb3Iga3cuZ2V0KGtleSwgJycpCisKKwl2YXIgPSBrdy5nZXQoJ3VzZWxpYl9zdG9yZScsICdCT09TVCcpCisKKwlzZWxmLmZpbmRfcHJvZ3JhbSgnZHBrZy1hcmNoaXRlY3R1cmUnLCB2YXI9J0RQS0dfQVJDSElURUNUVVJFJywgbWFuZGF0b3J5PUZhbHNlKQorCWlmIHNlbGYuZW52LkRQS0dfQVJDSElURUNUVVJFOgorCQlkZWJfaG9zdF9tdWx0aWFyY2ggPSBzZWxmLmNtZF9hbmRfbG9nKFtzZWxmLmVudi5EUEtHX0FSQ0hJVEVDVFVSRVswXSwgJy1xREVCX0hPU1RfTVVMVElBUkNIJ10pCisJCUJPT1NUX0xJQlMuaW5zZXJ0KDAsICcvdXNyL2xpYi8lcycgJSBkZWJfaG9zdF9tdWx0aWFyY2guc3RyaXAoKSkKKworCXNlbGYuc3RhcnRfbXNnKCdDaGVja2luZyBib29zdCBpbmNsdWRlcycpCisJc2VsZi5lbnZbJ0lOQ0xVREVTXyVzJyAlIHZhcl0gPSBpbmMgPSBzZWxmLmJvb3N0X2dldF9pbmNsdWRlcygqKnBhcmFtcykKKwl2ZXJzaW9ucyA9IHNlbGYuYm9vc3RfZ2V0X3ZlcnNpb24oaW5jKQorCXNlbGYuZW52LkJPT1NUX1ZFUlNJT04gPSB2ZXJzaW9uc1swXQorCXNlbGYuZW52LkJPT1NUX1ZFUlNJT05fTlVNQkVSID0gaW50KHZlcnNpb25zWzFdKQorCXNlbGYuZW5kX21zZygiJWQuJWQuJWQiICUgKGludCh2ZXJzaW9uc1sxXSkgLyAxMDAwMDAsCisJCQkJCQkJICAgaW50KHZlcnNpb25zWzFdKSAvIDEwMCAlIDEwMDAsCisJCQkJCQkJICAgaW50KHZlcnNpb25zWzFdKSAlIDEwMCkpCisJaWYgTG9ncy52ZXJib3NlOgorCQlMb2dzLnBwcmludCgnQ1lBTicsICcJcGF0aCA6ICVzJyAlIHNlbGYuZW52WydJTkNMVURFU18lcycgJSB2YXJdKQorCisJaWYgbm90IHBhcmFtc1snbGliJ10gYW5kIG5vdCBwYXJhbXNbJ3N0bGliJ106CisJCXJldHVybgorCWlmICdzdGF0aWMnIGluIGt3IG9yICdzdGF0aWMnIGluIHBhcmFtczoKKwkJTG9ncy53YXJuKCdib29zdDogc3RhdGljIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLCB1c2Ugc3RsaWIgaW5zdGVhZC4nKQorCXNlbGYuc3RhcnRfbXNnKCdDaGVja2luZyBib29zdCBsaWJzJykKKwlwYXRoLCBsaWJzLCBzdGxpYnMgPSBzZWxmLmJvb3N0X2dldF9saWJzKCoqcGFyYW1zKQorCXNlbGYuZW52WydMSUJQQVRIXyVzJyAlIHZhcl0gPSBbcGF0aF0KKwlzZWxmLmVudlsnU1RMSUJQQVRIXyVzJyAlIHZhcl0gPSBbcGF0aF0KKwlzZWxmLmVudlsnTElCXyVzJyAlIHZhcl0gPSBsaWJzCisJc2VsZi5lbnZbJ1NUTElCXyVzJyAlIHZhcl0gPSBzdGxpYnMKKwlzZWxmLmVuZF9tc2coJ29rJykKKwlpZiBMb2dzLnZlcmJvc2U6CisJCUxvZ3MucHByaW50KCdDWUFOJywgJwlwYXRoIDogJXMnICUgcGF0aCkKKwkJTG9ncy5wcHJpbnQoJ0NZQU4nLCAnCXNoYXJlZCBsaWJzIDogJXMnICUgbGlicykKKwkJTG9ncy5wcHJpbnQoJ0NZQU4nLCAnCXN0YXRpYyBsaWJzIDogJXMnICUgc3RsaWJzKQorCisJZGVmIGhhc19zaGxpYihsaWIpOgorCQlyZXR1cm4gcGFyYW1zWydsaWInXSBhbmQgbGliIGluIHBhcmFtc1snbGliJ10KKwlkZWYgaGFzX3N0bGliKGxpYik6CisJCXJldHVybiBwYXJhbXNbJ3N0bGliJ10gYW5kIGxpYiBpbiBwYXJhbXNbJ3N0bGliJ10KKwlkZWYgaGFzX2xpYihsaWIpOgorCQlyZXR1cm4gaGFzX3NobGliKGxpYikgb3IgaGFzX3N0bGliKGxpYikKKwlpZiBoYXNfbGliKCd0aHJlYWQnKToKKwkJIyBub3QgaW5zaWRlIHRyeV9saW5rIHRvIG1ha2UgY2hlY2sgdmlzaWJsZSBpbiB0aGUgb3V0cHV0CisJCXNlbGYuX2NoZWNrX3B0aHJlYWRfZmxhZyhrLCBrdykKKworCWRlZiB0cnlfbGluaygpOgorCQlpZiBoYXNfbGliKCdzeXN0ZW0nKToKKwkJCXNlbGYuY2hlY2tfY3h4KGZyYWdtZW50PUJPT1NUX0VSUk9SX0NPREUsIHVzZT12YXIsIGV4ZWN1dGU9RmFsc2UpCisJCWlmIGhhc19saWIoJ3RocmVhZCcpOgorCQkJc2VsZi5jaGVja19jeHgoZnJhZ21lbnQ9Qk9PU1RfVEhSRUFEX0NPREUsIHVzZT12YXIsIGV4ZWN1dGU9RmFsc2UpCisJCWlmIGhhc19saWIoJ2xvZycpOgorCQkJaWYgbm90IGhhc19saWIoJ3RocmVhZCcpOgorCQkJCXNlbGYuZW52WydERUZJTkVTXyVzJyAlIHZhcl0gKz0gWydCT09TVF9MT0dfTk9fVEhSRUFEUyddCisJCQlpZiBoYXNfc2hsaWIoJ2xvZycpOgorCQkJCXNlbGYuZW52WydERUZJTkVTXyVzJyAlIHZhcl0gKz0gWydCT09TVF9MT0dfRFlOX0xJTksnXQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19jeHgoZnJhZ21lbnQ9Qk9PU1RfTE9HX0NPREUsIHVzZT12YXIsIGV4ZWN1dGU9RmFsc2UpCisKKwlpZiBwYXJhbXMuZ2V0KCdsaW5rYWdlX2F1dG9kZXRlY3QnLCBGYWxzZSk6CisJCXNlbGYuc3RhcnRfbXNnKCJBdHRlbXB0aW5nIHRvIGRldGVjdCBib29zdCBsaW5rYWdlIGZsYWdzIikKKwkJdG9vbHNldCA9IHNlbGYuYm9vc3RfZ2V0X3Rvb2xzZXQoa3cuZ2V0KCd0b29sc2V0JywgJycpKQorCQlpZiB0b29sc2V0IGluICgndmMnLCk6CisJCQkjIGRpc2FibGUgYXV0by1saW5raW5nIGZlYXR1cmUsIGNhdXNpbmcgZXJyb3IgTE5LMTE4MQorCQkJIyBiZWNhdXNlIHRoZSBjb2RlIHdhbnRzIHRvIGJlIGxpbmtlZCBhZ2FpbnN0CisJCQlzZWxmLmVudlsnREVGSU5FU18lcycgJSB2YXJdICs9IFsnQk9PU1RfQUxMX05PX0xJQiddCisKKwkJCSMgaWYgbm8gZGxscyBhcmUgcHJlc2VudCwgd2UgZ3Vlc3MgdGhlIC5saWIgZmlsZXMgYXJlIG5vdCBzdHVicworCQkJaGFzX2RsbHMgPSBGYWxzZQorCQkJZm9yIHggaW4gVXRpbHMubGlzdGRpcihwYXRoKToKKwkJCQlpZiB4LmVuZHN3aXRoKHNlbGYuZW52LmN4eHNobGliX1BBVFRFUk4gJSAnJyk6CisJCQkJCWhhc19kbGxzID0gVHJ1ZQorCQkJCQlicmVhaworCQkJaWYgbm90IGhhc19kbGxzOgorCQkJCXNlbGYuZW52WydTVExJQlBBVEhfJXMnICUgdmFyXSA9IFtwYXRoXQorCQkJCXNlbGYuZW52WydTVExJQl8lcycgJSB2YXJdID0gbGlicworCQkJCWRlbCBzZWxmLmVudlsnTElCXyVzJyAlIHZhcl0KKwkJCQlkZWwgc2VsZi5lbnZbJ0xJQlBBVEhfJXMnICUgdmFyXQorCisJCQkjIHdlIGF0dGVtcHQgdG8gcGxheSB3aXRoIHNvbWUga25vd24tdG8td29yayBDWFhGTEFHUyBjb21iaW5hdGlvbnMKKwkJCWZvciBjeHhmbGFncyBpbiAoWycvTUQnLCAnL0VIc2MnXSwgW10pOgorCQkJCXNlbGYuZW52LnN0YXNoKCkKKwkJCQlzZWxmLmVudlsiQ1hYRkxBR1NfJXMiICUgdmFyXSArPSBjeHhmbGFncworCQkJCXRyeToKKwkJCQkJdHJ5X2xpbmsoKQorCQkJCQlzZWxmLmVuZF9tc2coIm9rOiB3aW5uaW5nIGN4eGZsYWdzIGNvbWJpbmF0aW9uOiAlcyIgJSAoc2VsZi5lbnZbIkNYWEZMQUdTXyVzIiAlIHZhcl0pKQorCQkJCQlleGMgPSBOb25lCisJCQkJCWJyZWFrCisJCQkJZXhjZXB0IEVycm9ycy5Db25maWd1cmF0aW9uRXJyb3IgYXMgZToKKwkJCQkJc2VsZi5lbnYucmV2ZXJ0KCkKKwkJCQkJZXhjID0gZQorCisJCQlpZiBleGMgaXMgbm90IE5vbmU6CisJCQkJc2VsZi5lbmRfbXNnKCJDb3VsZCBub3QgYXV0by1kZXRlY3QgYm9vc3QgbGlua2luZyBmbGFncyBjb21iaW5hdGlvbiwgeW91IG1heSByZXBvcnQgaXQgdG8gYm9vc3QucHkgYXV0aG9yIiwgZXg9ZXhjKQorCQkJCXNlbGYuZmF0YWwoJ1RoZSBjb25maWd1cmF0aW9uIGZhaWxlZCcpCisJCWVsc2U6CisJCQlzZWxmLmVuZF9tc2coIkJvb3N0IGxpbmthZ2UgZmxhZ3MgYXV0by1kZXRlY3Rpb24gbm90IGltcGxlbWVudGVkIChuZWVkZWQgPykgZm9yIHRoaXMgdG9vbGNoYWluIikKKwkJCXNlbGYuZmF0YWwoJ1RoZSBjb25maWd1cmF0aW9uIGZhaWxlZCcpCisJZWxzZToKKwkJc2VsZi5zdGFydF9tc2coJ0NoZWNraW5nIGZvciBib29zdCBsaW5rYWdlJykKKwkJdHJ5OgorCQkJdHJ5X2xpbmsoKQorCQlleGNlcHQgRXJyb3JzLkNvbmZpZ3VyYXRpb25FcnJvciBhcyBlOgorCQkJc2VsZi5lbmRfbXNnKCJDb3VsZCBub3QgbGluayBhZ2FpbnN0IGJvb3N0IGxpYnJhcmllcyB1c2luZyBzdXBwbGllZCBvcHRpb25zIikKKwkJCXNlbGYuZmF0YWwoJ1RoZSBjb25maWd1cmF0aW9uIGZhaWxlZCcpCisJCXNlbGYuZW5kX21zZygnb2snKQorCisKK0BmZWF0dXJlKCdjeHgnKQorQGFmdGVyX21ldGhvZCgnYXBwbHlfbGluaycpCitkZWYgaW5zdGFsbF9ib29zdChzZWxmKToKKwlpZiBpbnN0YWxsX2Jvb3N0LmRvbmUgb3Igbm90IFV0aWxzLmlzX3dpbjMyIG9yIG5vdCBzZWxmLmJsZC5jbWQuc3RhcnRzd2l0aCgnaW5zdGFsbCcpOgorCQlyZXR1cm4KKwlpbnN0YWxsX2Jvb3N0LmRvbmUgPSBUcnVlCisJaW5zdF90byA9IGdldGF0dHIoc2VsZiwgJ2luc3RhbGxfcGF0aCcsICcke0JJTkRJUn0nKQorCWZvciBsaWIgaW4gc2VsZi5lbnYuTElCX0JPT1NUOgorCQl0cnk6CisJCQlmaWxlID0gc2VsZi5ibGQuZmluZF9maWxlKHNlbGYuZW52LmN4eHNobGliX1BBVFRFUk4gJSBsaWIsIHNlbGYuZW52LkxJQlBBVEhfQk9PU1QpCisJCQlzZWxmLmJsZC5pbnN0YWxsX2ZpbGVzKGluc3RfdG8sIHNlbGYuYmxkLnJvb3QuZmluZF9ub2RlKGZpbGUpKQorCQlleGNlcHQ6CisJCQljb250aW51ZQoraW5zdGFsbF9ib29zdC5kb25lID0gRmFsc2UKZGlmZiAtLWdpdCBhLy53YWYtdG9vbHMvY292ZXJhZ2UucHkgYi8ud2FmLXRvb2xzL2NvdmVyYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTgxNjUKLS0tIC9kZXYvbnVsbAorKysgYi8ud2FmLXRvb2xzL2NvdmVyYWdlLnB5CkBAIC0wLDAgKzEsMjIgQEAKKyMgLSotIE1vZGU6IHB5dGhvbjsgcHktaW5kZW50LW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyBjb2Rpbmc6IHV0Zi04OyAtKi0KKworZnJvbSB3YWZsaWIgaW1wb3J0IFRhc2tHZW4KKworZGVmIG9wdGlvbnMob3B0KToKKyAgICBvcHQuYWRkX29wdGlvbignLS13aXRoLWNvdmVyYWdlJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICBoZWxwPSdBZGQgY29tcGlsZXIgZmxhZ3MgdG8gZW5hYmxlIGNvZGUgY292ZXJhZ2UgaW5mb3JtYXRpb24nKQorCitkZWYgY29uZmlndXJlKGNvbmYpOgorICAgIGlmIGNvbmYub3B0aW9ucy53aXRoX2NvdmVyYWdlOgorICAgICAgICBpZiBub3QgY29uZi5vcHRpb25zLmRlYnVnOgorICAgICAgICAgICAgY29uZi5mYXRhbCgnQ29kZSBjb3ZlcmFnZSBmbGFncyByZXF1aXJlIGRlYnVnIG1vZGUgY29tcGlsYXRpb24gKGFkZCAtLWRlYnVnKScpCisgICAgICAgIGNvbmYuY2hlY2tfY3h4KGN4eGZsYWdzPVsnLWZwcm9maWxlLWFyY3MnLCAnLWZ0ZXN0LWNvdmVyYWdlJywgJy1mUElDJ10sCisgICAgICAgICAgICAgICAgICAgICAgIGxpbmtmbGFncz1bJy1mcHJvZmlsZS1hcmNzJ10sIHVzZWxpYl9zdG9yZT0nR0NPVicsIG1hbmRhdG9yeT1UcnVlKQorCitAVGFza0dlbi5mZWF0dXJlKCdjeHgnLCdjYycpCitAVGFza0dlbi5hZnRlcigncHJvY2Vzc19zb3VyY2UnKQorZGVmIGFkZF9jb3ZlcmFnZShzZWxmKToKKyAgICBpZiBnZXRhdHRyKHNlbGYsICd1c2UnLCAnJyk6CisgICAgICAgIHNlbGYudXNlICs9ICcgR0NPVicKKyAgICBlbHNlOgorICAgICAgICBzZWxmLnVzZSA9ICdHQ09WJwpkaWZmIC0tZ2l0IGEvLndhZi10b29scy9kZWZhdWx0LWNvbXBpbGVyLWZsYWdzLnB5IGIvLndhZi10b29scy9kZWZhdWx0LWNvbXBpbGVyLWZsYWdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OTAyOTAKLS0tIC9kZXYvbnVsbAorKysgYi8ud2FmLXRvb2xzL2RlZmF1bHQtY29tcGlsZXItZmxhZ3MucHkKQEAgLTAsMCArMSwyMTAgQEAKKyMgLSotIE1vZGU6IHB5dGhvbjsgcHktaW5kZW50LW9mZnNldDogNDsgaW5kZW50LXRhYnMtbW9kZTogbmlsOyBjb2Rpbmc6IHV0Zi04OyAtKi0KKworZnJvbSB3YWZsaWIgaW1wb3J0IENvbmZpZ3VyZSwgTG9ncywgVXRpbHMKKworZGVmIG9wdGlvbnMob3B0KToKKyAgICBvcHQuYWRkX29wdGlvbignLS1kZWJ1ZycsICctLXdpdGgtZGVidWcnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgIGhlbHA9J0NvbXBpbGUgaW4gZGVidWdnaW5nIG1vZGUgd2l0aCBtaW5pbWFsIG9wdGltaXphdGlvbnMgKC1PMCBvciAtT2cpJykKKworZGVmIGNvbmZpZ3VyZShjb25mKToKKyAgICBjb25mLnN0YXJ0X21zZygnQ2hlY2tpbmcgQysrIGNvbXBpbGVyIHZlcnNpb24nKQorCisgICAgY3h4ID0gY29uZi5lbnYuQ1hYX05BTUUgIyBnZW5lcmljIG5hbWUgb2YgdGhlIGNvbXBpbGVyCisgICAgY2N2ZXIgPSB0dXBsZShpbnQoaSkgZm9yIGkgaW4gY29uZi5lbnYuQ0NfVkVSU0lPTikKKyAgICBjY3ZlcnN0ciA9ICcuJy5qb2luKGNvbmYuZW52LkNDX1ZFUlNJT04pCisgICAgZXJybXNnID0gJycKKyAgICB3YXJubXNnID0gJycKKyAgICBpZiBjeHggPT0gJ2djYyc6CisgICAgICAgIGlmIGNjdmVyIDwgKDUsIDMsIDApOgorICAgICAgICAgICAgZXJybXNnID0gKCdUaGUgdmVyc2lvbiBvZiBnY2MgeW91IGFyZSB1c2luZyBpcyB0b28gb2xkLlxuJworICAgICAgICAgICAgICAgICAgICAgICdUaGUgbWluaW11bSBzdXBwb3J0ZWQgZ2NjIHZlcnNpb24gaXMgNS4zLjAuJykKKyAgICAgICAgY29uZi5mbGFncyA9IEdjY0ZsYWdzKCkKKyAgICBlbGlmIGN4eCA9PSAnY2xhbmcnOgorICAgICAgICBpZiBjY3ZlciA8ICgzLCA1LCAwKToKKyAgICAgICAgICAgIGVycm1zZyA9ICgnVGhlIHZlcnNpb24gb2YgY2xhbmcgeW91IGFyZSB1c2luZyBpcyB0b28gb2xkLlxuJworICAgICAgICAgICAgICAgICAgICAgICdUaGUgbWluaW11bSBzdXBwb3J0ZWQgY2xhbmcgdmVyc2lvbiBpcyAzLjUuMC4nKQorICAgICAgICBjb25mLmZsYWdzID0gQ2xhbmdGbGFncygpCisgICAgZWxzZToKKyAgICAgICAgd2Fybm1zZyA9ICdOb3RlOiAlcyBjb21waWxlciBpcyB1bnN1cHBvcnRlZCcgJSBjeHgKKyAgICAgICAgY29uZi5mbGFncyA9IENvbXBpbGVyRmxhZ3MoKQorCisgICAgaWYgZXJybXNnOgorICAgICAgICBjb25mLmVuZF9tc2coY2N2ZXJzdHIsIGNvbG9yPSdSRUQnKQorICAgICAgICBjb25mLmZhdGFsKGVycm1zZykKKyAgICBlbGlmIHdhcm5tc2c6CisgICAgICAgIGNvbmYuZW5kX21zZyhjY3ZlcnN0ciwgY29sb3I9J1lFTExPVycpCisgICAgICAgIExvZ3Mud2Fybih3YXJubXNnKQorICAgIGVsc2U6CisgICAgICAgIGNvbmYuZW5kX21zZyhjY3ZlcnN0cikKKworICAgIGNvbmYuYXJlQ3VzdG9tQ3h4ZmxhZ3NQcmVzZW50ID0gKGxlbihjb25mLmVudi5DWFhGTEFHUykgPiAwKQorCisgICAgIyBHZW5lcmFsIGZsYWdzIGFyZSBhbHdheXMgYXBwbGllZCAoZS5nLiwgc2VsZWN0aW5nIEMrKyBsYW5ndWFnZSBzdGFuZGFyZCkKKyAgICBnZW5lcmFsRmxhZ3MgPSBjb25mLmZsYWdzLmdldEdlbmVyYWxGbGFncyhjb25mKQorICAgIGNvbmYuYWRkX3N1cHBvcnRlZF9jeHhmbGFncyhnZW5lcmFsRmxhZ3NbJ0NYWEZMQUdTJ10pCisgICAgY29uZi5hZGRfc3VwcG9ydGVkX2xpbmtmbGFncyhnZW5lcmFsRmxhZ3NbJ0xJTktGTEFHUyddKQorICAgIGNvbmYuZW52LkRFRklORVMgKz0gZ2VuZXJhbEZsYWdzWydERUZJTkVTJ10KKworQENvbmZpZ3VyZS5jb25mCitkZWYgY2hlY2tfY29tcGlsZXJfZmxhZ3MoY29uZik6CisgICAgIyBEZWJ1ZyBvciBvcHRpbWl6ZWQgQ1hYRkxBR1MgYW5kIExJTktGTEFHUyBhcmUgYXBwbGllZCBvbmx5IGlmIHRoZQorICAgICMgY29ycmVzcG9uZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG5vdCBzZXQuCisgICAgIyBERUZJTkVTIGFyZSBhbHdheXMgYXBwbGllZC4KKyAgICBpZiBjb25mLm9wdGlvbnMuZGVidWc6CisgICAgICAgIGV4dHJhRmxhZ3MgPSBjb25mLmZsYWdzLmdldERlYnVnRmxhZ3MoY29uZikKKyAgICAgICAgaWYgY29uZi5hcmVDdXN0b21DeHhmbGFnc1ByZXNlbnQ6CisgICAgICAgICAgICBtaXNzaW5nRmxhZ3MgPSBbeCBmb3IgeCBpbiBleHRyYUZsYWdzWydDWFhGTEFHUyddIGlmIHggbm90IGluIGNvbmYuZW52LkNYWEZMQUdTXQorICAgICAgICAgICAgaWYgbWlzc2luZ0ZsYWdzOgorICAgICAgICAgICAgICAgIExvZ3Mud2FybignU2VsZWN0ZWQgZGVidWcgbW9kZSwgYnV0IENYWEZMQUdTIGlzIHNldCB0byBhIGN1c3RvbSB2YWx1ZSAiJXMiJworICAgICAgICAgICAgICAgICAgICAgICAgICAlICcgJy5qb2luKGNvbmYuZW52LkNYWEZMQUdTKSkKKyAgICAgICAgICAgICAgICBMb2dzLndhcm4oJ0RlZmF1bHQgZmxhZ3MgIiVzIiB3aWxsIG5vdCBiZSB1c2VkJyAlICcgJy5qb2luKG1pc3NpbmdGbGFncykpCisgICAgZWxzZToKKyAgICAgICAgZXh0cmFGbGFncyA9IGNvbmYuZmxhZ3MuZ2V0T3B0aW1pemVkRmxhZ3MoY29uZikKKworICAgIGlmIG5vdCBjb25mLmFyZUN1c3RvbUN4eGZsYWdzUHJlc2VudDoKKyAgICAgICAgY29uZi5hZGRfc3VwcG9ydGVkX2N4eGZsYWdzKGV4dHJhRmxhZ3NbJ0NYWEZMQUdTJ10pCisgICAgICAgIGNvbmYuYWRkX3N1cHBvcnRlZF9saW5rZmxhZ3MoZXh0cmFGbGFnc1snTElOS0ZMQUdTJ10pCisKKyAgICBjb25mLmVudi5ERUZJTkVTICs9IGV4dHJhRmxhZ3NbJ0RFRklORVMnXQorCitAQ29uZmlndXJlLmNvbmYKK2RlZiBhZGRfc3VwcG9ydGVkX2N4eGZsYWdzKHNlbGYsIGN4eGZsYWdzKToKKyAgICAiIiIKKyAgICBDaGVjayB3aGljaCBjeHhmbGFncyBhcmUgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyIGFuZCBhZGQgdGhlbSB0byBlbnYuQ1hYRkxBR1MgdmFyaWFibGUKKyAgICAiIiIKKyAgICBpZiBsZW4oY3h4ZmxhZ3MpID09IDA6CisgICAgICAgIHJldHVybgorCisgICAgc2VsZi5zdGFydF9tc2coJ0NoZWNraW5nIHN1cHBvcnRlZCBDWFhGTEFHUycpCisKKyAgICBzdXBwb3J0ZWRGbGFncyA9IFtdCisgICAgZm9yIGZsYWdzIGluIGN4eGZsYWdzOgorICAgICAgICBmbGFncyA9IFV0aWxzLnRvX2xpc3QoZmxhZ3MpCisgICAgICAgIGlmIHNlbGYuY2hlY2tfY3h4KGN4eGZsYWdzPVsnLVdlcnJvciddICsgZmxhZ3MsIG1hbmRhdG9yeT1GYWxzZSk6CisgICAgICAgICAgICBzdXBwb3J0ZWRGbGFncyArPSBmbGFncworCisgICAgc2VsZi5lbmRfbXNnKCcgJy5qb2luKHN1cHBvcnRlZEZsYWdzKSkKKyAgICBzZWxmLmVudi5wcmVwZW5kX3ZhbHVlKCdDWFhGTEFHUycsIHN1cHBvcnRlZEZsYWdzKQorCitAQ29uZmlndXJlLmNvbmYKK2RlZiBhZGRfc3VwcG9ydGVkX2xpbmtmbGFncyhzZWxmLCBsaW5rZmxhZ3MpOgorICAgICIiIgorICAgIENoZWNrIHdoaWNoIGxpbmtmbGFncyBhcmUgc3VwcG9ydGVkIGJ5IGNvbXBpbGVyIGFuZCBhZGQgdGhlbSB0byBlbnYuTElOS0ZMQUdTIHZhcmlhYmxlCisgICAgIiIiCisgICAgaWYgbGVuKGxpbmtmbGFncykgPT0gMDoKKyAgICAgICAgcmV0dXJuCisKKyAgICBzZWxmLnN0YXJ0X21zZygnQ2hlY2tpbmcgc3VwcG9ydGVkIExJTktGTEFHUycpCisKKyAgICBzdXBwb3J0ZWRGbGFncyA9IFtdCisgICAgZm9yIGZsYWdzIGluIGxpbmtmbGFnczoKKyAgICAgICAgZmxhZ3MgPSBVdGlscy50b19saXN0KGZsYWdzKQorICAgICAgICBpZiBzZWxmLmNoZWNrX2N4eChsaW5rZmxhZ3M9WyctV2Vycm9yJ10gKyBmbGFncywgbWFuZGF0b3J5PUZhbHNlKToKKyAgICAgICAgICAgIHN1cHBvcnRlZEZsYWdzICs9IGZsYWdzCisKKyAgICBzZWxmLmVuZF9tc2coJyAnLmpvaW4oc3VwcG9ydGVkRmxhZ3MpKQorICAgIHNlbGYuZW52LnByZXBlbmRfdmFsdWUoJ0xJTktGTEFHUycsIHN1cHBvcnRlZEZsYWdzKQorCisKK2NsYXNzIENvbXBpbGVyRmxhZ3Mob2JqZWN0KToKKyAgICBkZWYgZ2V0Q29tcGlsZXJWZXJzaW9uKHNlbGYsIGNvbmYpOgorICAgICAgICByZXR1cm4gdHVwbGUoaW50KGkpIGZvciBpIGluIGNvbmYuZW52LkNDX1ZFUlNJT04pCisKKyAgICBkZWYgZ2V0R2VuZXJhbEZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICAiIiJHZXQgZGljdCBvZiBDWFhGTEFHUywgTElOS0ZMQUdTLCBhbmQgREVGSU5FUyB0aGF0IGFyZSBhbHdheXMgbmVlZGVkIiIiCisgICAgICAgIHJldHVybiB7J0NYWEZMQUdTJzogW10sICdMSU5LRkxBR1MnOiBbXSwgJ0RFRklORVMnOiBbXX0KKworICAgIGRlZiBnZXREZWJ1Z0ZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICAiIiJHZXQgZGljdCBvZiBDWFhGTEFHUywgTElOS0ZMQUdTLCBhbmQgREVGSU5FUyB0aGF0IGFyZSBuZWVkZWQgb25seSBpbiBkZWJ1ZyBtb2RlIiIiCisgICAgICAgIHJldHVybiB7J0NYWEZMQUdTJzogW10sICdMSU5LRkxBR1MnOiBbXSwgJ0RFRklORVMnOiBbJ19ERUJVRyddfQorCisgICAgZGVmIGdldE9wdGltaXplZEZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICAiIiJHZXQgZGljdCBvZiBDWFhGTEFHUywgTElOS0ZMQUdTLCBhbmQgREVGSU5FUyB0aGF0IGFyZSBuZWVkZWQgb25seSBpbiBvcHRpbWl6ZWQgbW9kZSIiIgorICAgICAgICByZXR1cm4geydDWFhGTEFHUyc6IFtdLCAnTElOS0ZMQUdTJzogW10sICdERUZJTkVTJzogWydOREVCVUcnXX0KKworY2xhc3MgR2NjQmFzaWNGbGFncyhDb21waWxlckZsYWdzKToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGRlZmluZXMgYmFzaWMgZmxhZ3MgdGhhdCB3b3JrIGZvciBib3RoIGdjYyBhbmQgY2xhbmcgY29tcGlsZXJzCisgICAgIiIiCisgICAgZGVmIGdldEdlbmVyYWxGbGFncyhzZWxmLCBjb25mKToKKyAgICAgICAgZmxhZ3MgPSBzdXBlcihHY2NCYXNpY0ZsYWdzLCBzZWxmKS5nZXRHZW5lcmFsRmxhZ3MoY29uZikKKyAgICAgICAgZmxhZ3NbJ0NYWEZMQUdTJ10gKz0gWyctc3RkPWMrKzE0J10KKyAgICAgICAgcmV0dXJuIGZsYWdzCisKKyAgICBkZWYgZ2V0RGVidWdGbGFncyhzZWxmLCBjb25mKToKKyAgICAgICAgZmxhZ3MgPSBzdXBlcihHY2NCYXNpY0ZsYWdzLCBzZWxmKS5nZXREZWJ1Z0ZsYWdzKGNvbmYpCisgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFsnLU8wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctT2cnLCAjIGdjYyA+PSA0LjgsIGNsYW5nID49IDQuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1nMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLXBlZGFudGljJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV2FsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVdleHRyYScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVdlcnJvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVdub24tdmlydHVhbC1kdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zJywgIyBCdWcgIzM3OTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLWVycm9yPW1heWJlLXVuaW5pdGlhbGl6ZWQnLCAjIEJ1ZyAjMTYxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1Xbm8tdW51c2VkLXBhcmFtZXRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGZsYWdzWydMSU5LRkxBR1MnXSArPSBbJy1mdXNlLWxkPWdvbGQnLCAnLVdsLC1PMSddCisgICAgICAgIHJldHVybiBmbGFncworCisgICAgZGVmIGdldE9wdGltaXplZEZsYWdzKHNlbGYsIGNvbmYpOgorICAgICAgICBmbGFncyA9IHN1cGVyKEdjY0Jhc2ljRmxhZ3MsIHNlbGYpLmdldE9wdGltaXplZEZsYWdzKGNvbmYpCisgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFsnLU8yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLXBlZGFudGljJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV2FsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVdleHRyYScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVdub24tdmlydHVhbC1kdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLXVudXNlZC1wYXJhbWV0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBmbGFnc1snTElOS0ZMQUdTJ10gKz0gWyctZnVzZS1sZD1nb2xkJywgJy1XbCwtTzEnXQorICAgICAgICByZXR1cm4gZmxhZ3MKKworY2xhc3MgR2NjRmxhZ3MoR2NjQmFzaWNGbGFncyk6CisgICAgZGVmIGdldERlYnVnRmxhZ3Moc2VsZiwgY29uZik6CisgICAgICAgIGZsYWdzID0gc3VwZXIoR2NjRmxhZ3MsIHNlbGYpLmdldERlYnVnRmxhZ3MoY29uZikKKyAgICAgICAgZmxhZ3NbJ0NYWEZMQUdTJ10gKz0gWyctZmRpYWdub3N0aWNzLWNvbG9yJ10KKyAgICAgICAgcmV0dXJuIGZsYWdzCisKKyAgICBkZWYgZ2V0T3B0aW1pemVkRmxhZ3Moc2VsZiwgY29uZik6CisgICAgICAgIGZsYWdzID0gc3VwZXIoR2NjRmxhZ3MsIHNlbGYpLmdldE9wdGltaXplZEZsYWdzKGNvbmYpCisgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFsnLWZkaWFnbm9zdGljcy1jb2xvciddCisgICAgICAgIHJldHVybiBmbGFncworCitjbGFzcyBDbGFuZ0ZsYWdzKEdjY0Jhc2ljRmxhZ3MpOgorICAgIGRlZiBnZXRHZW5lcmFsRmxhZ3Moc2VsZiwgY29uZik6CisgICAgICAgIGZsYWdzID0gc3VwZXIoQ2xhbmdGbGFncywgc2VsZikuZ2V0R2VuZXJhbEZsYWdzKGNvbmYpCisgICAgICAgIGlmIFV0aWxzLnVudmVyc2lvbmVkX3N5c19wbGF0Zm9ybSgpID09ICdkYXJ3aW4nIGFuZCBzZWxmLmdldENvbXBpbGVyVmVyc2lvbihjb25mKSA+PSAoOSwgMCwgMCk6CisgICAgICAgICAgICAjIEJ1ZyAjNDI5NgorICAgICAgICAgICAgZmxhZ3NbJ0NYWEZMQUdTJ10gKz0gW1snLWlzeXN0ZW0nLCAnL3Vzci9sb2NhbC9pbmNsdWRlJ10sICMgZm9yIEhvbWVicmV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyctaXN5c3RlbScsICcvb3B0L2xvY2FsL2luY2x1ZGUnXV0gIyBmb3IgTWFjUG9ydHMKKyAgICAgICAgcmV0dXJuIGZsYWdzCisKKyAgICBkZWYgZ2V0RGVidWdGbGFncyhzZWxmLCBjb25mKToKKyAgICAgICAgZmxhZ3MgPSBzdXBlcihDbGFuZ0ZsYWdzLCBzZWxmKS5nZXREZWJ1Z0ZsYWdzKGNvbmYpCisgICAgICAgIGZsYWdzWydDWFhGTEFHUyddICs9IFsnLWZjb2xvci1kaWFnbm9zdGljcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVdleHRyYS1zZW1pJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV3VuZGVmaW5lZC1mdW5jLXRlbXBsYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLWVycm9yPWRlcHJlY2F0ZWQtcmVnaXN0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1Xbm8tZXJyb3I9aW5maW5pdGUtcmVjdXJzaW9uJywgIyBCdWcgIzMzNTgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLWVycm9yPWtleXdvcmQtbWFjcm8nLCAjIEJ1ZyAjMzIzNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1Xbm8tZXJyb3I9dW5uZWVkZWQtaW50ZXJuYWwtZGVjbGFyYXRpb24nLCAjIEJ1ZyAjMTU4OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1Xbm8tdW51c2VkLWxvY2FsLXR5cGVkZWYnLCAjIEJ1Z3MgIzI2NTcgYW5kICMzMjA5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIHZlcnNpb24gPSBzZWxmLmdldENvbXBpbGVyVmVyc2lvbihjb25mKQorICAgICAgICBpZiB2ZXJzaW9uIDwgKDMsIDksIDApIG9yIChVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKSA9PSAnZGFyd2luJyBhbmQgdmVyc2lvbiA8ICg4LCAxLCAwKSk6CisgICAgICAgICAgICBmbGFnc1snQ1hYRkxBR1MnXSArPSBbJy1Xbm8tdW5rbm93bi1wcmFnbWFzJ10KKyAgICAgICAgcmV0dXJuIGZsYWdzCisKKyAgICBkZWYgZ2V0T3B0aW1pemVkRmxhZ3Moc2VsZiwgY29uZik6CisgICAgICAgIGZsYWdzID0gc3VwZXIoQ2xhbmdGbGFncywgc2VsZikuZ2V0T3B0aW1pemVkRmxhZ3MoY29uZikKKyAgICAgICAgZmxhZ3NbJ0NYWEZMQUdTJ10gKz0gWyctZmNvbG9yLWRpYWdub3N0aWNzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctV2V4dHJhLXNlbWknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1XdW5kZWZpbmVkLWZ1bmMtdGVtcGxhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1Xbm8tdW51c2VkLWxvY2FsLXR5cGVkZWYnLCAjIEJ1Z3MgIzI2NTcgYW5kICMzMjA5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIHZlcnNpb24gPSBzZWxmLmdldENvbXBpbGVyVmVyc2lvbihjb25mKQorICAgICAgICBpZiB2ZXJzaW9uIDwgKDMsIDksIDApIG9yIChVdGlscy51bnZlcnNpb25lZF9zeXNfcGxhdGZvcm0oKSA9PSAnZGFyd2luJyBhbmQgdmVyc2lvbiA8ICg4LCAxLCAwKSk6CisgICAgICAgICAgICBmbGFnc1snQ1hYRkxBR1MnXSArPSBbJy1Xbm8tdW5rbm93bi1wcmFnbWFzJ10KKyAgICAgICAgcmV0dXJuIGZsYWdzCmRpZmYgLS1naXQgYS8ud2FmLXRvb2xzL2RlcGVuZGVuY3ktY2hlY2tlci5weSBiLy53YWYtdG9vbHMvZGVwZW5kZW5jeS1jaGVja2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOWZiZmQKLS0tIC9kZXYvbnVsbAorKysgYi8ud2FmLXRvb2xzL2RlcGVuZGVuY3ktY2hlY2tlci5weQpAQCAtMCwwICsxLDI4IEBACisjIGVuY29kaW5nOiB1dGYtOAorCitmcm9tIHdhZmxpYiBpbXBvcnQgT3B0aW9ucywgTG9ncworZnJvbSB3YWZsaWIuQ29uZmlndXJlIGltcG9ydCBjb25mCisKK2RlZiBhZGREZXBlbmRlbmN5T3B0aW9ucyhzZWxmLCBvcHQsIG5hbWUsIGV4dHJhSGVscD0nJyk6CisgICAgb3B0LmFkZF9vcHRpb24oJy0td2l0aC0lcycgJSBuYW1lLCB0eXBlPSdzdHJpbmcnLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgZGVzdD0nd2l0aF8lcycgJSBuYW1lLAorICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gJXMsIGUuZy4sIC91c3IvbG9jYWwgJXMnICUgKG5hbWUsIGV4dHJhSGVscCkpCitzZXRhdHRyKE9wdGlvbnMuT3B0aW9uc0NvbnRleHQsICJhZGREZXBlbmRlbmN5T3B0aW9ucyIsIGFkZERlcGVuZGVuY3lPcHRpb25zKQorCitAY29uZgorZGVmIGNoZWNrRGVwZW5kZW5jeShzZWxmLCBuYW1lLCAqKmt3KToKKyAgICByb290ID0ga3cuZ2V0KCdwYXRoJywgZ2V0YXR0cihPcHRpb25zLm9wdGlvbnMsICd3aXRoXyVzJyAlIG5hbWUpKQorICAgIGt3Wydtc2cnXSA9IGt3LmdldCgnbXNnJywgJ0NoZWNraW5nIGZvciAlcyBsaWJyYXJ5JyAlIG5hbWUpCisgICAga3dbJ3VzZWxpYl9zdG9yZSddID0ga3cuZ2V0KCd1c2VsaWJfc3RvcmUnLCBuYW1lLnVwcGVyKCkpCisgICAga3dbJ2RlZmluZV9uYW1lJ10gPSBrdy5nZXQoJ2RlZmluZV9uYW1lJywgJ0hBVkVfJXMnICUga3dbJ3VzZWxpYl9zdG9yZSddKQorICAgIGt3WydtYW5kYXRvcnknXSA9IGt3LmdldCgnbWFuZGF0b3J5JywgVHJ1ZSkKKworICAgIGlmIHJvb3Q6CisgICAgICAgIGlzT2sgPSBzZWxmLmNoZWNrX2N4eChpbmNsdWRlcz0iJXMvaW5jbHVkZSIgJSByb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicGF0aD0iJXMvbGliIiAlIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3KQorICAgIGVsc2U6CisgICAgICAgIGlzT2sgPSBzZWxmLmNoZWNrX2N4eCgqKmt3KQorCisgICAgaWYgaXNPazoKKyAgICAgICAgc2VsZi5lbnZba3dbJ2RlZmluZV9uYW1lJ11dID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvLndhZi10b29scy9kb3h5Z2VuLnB5IGIvLndhZi10b29scy9kb3h5Z2VuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODA2NmIKLS0tIC9kZXYvbnVsbAorKysgYi8ud2FmLXRvb2xzL2RveHlnZW4ucHkKQEAgLTAsMCArMSwyMTQgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyMgZW5jb2Rpbmc6IFVURi04CisjIFRob21hcyBOYWd5IDIwMDgtMjAxMCAoaXRhKQorCisiIiIKKworRG94eWdlbiBzdXBwb3J0CisKK1ZhcmlhYmxlcyBwYXNzZWQgdG8gYmxkKCk6CisqIGRveHlmaWxlIC0tIHRoZSBEb3h5ZmlsZSB0byB1c2UKKworV2hlbiB1c2luZyB0aGlzIHRvb2wsIHRoZSB3c2NyaXB0IHdpbGwgbG9vayBsaWtlOgorCisJZGVmIG9wdGlvbnMob3B0KToKKwkJb3B0LmxvYWQoJ2RveHlnZW4nKQorCisJZGVmIGNvbmZpZ3VyZShjb25mKToKKwkJY29uZi5sb2FkKCdkb3h5Z2VuJykKKwkJIyBjaGVjayBjb25mLmVudi5ET1hZR0VOLCBpZiBpdCBpcyBtYW5kYXRvcnkKKworCWRlZiBidWlsZChibGQpOgorCQlpZiBibGQuZW52LkRPWFlHRU46CisJCQlibGQoZmVhdHVyZXM9ImRveHlnZW4iLCBkb3h5ZmlsZT0nRG94eWZpbGUnLCAuLi4pCisKKyAgICAgICAgZGVmIGRveHlnZW4oYmxkKToKKwkJaWYgYmxkLmVudi5ET1hZR0VOOgorCQkJYmxkKGZlYXR1cmVzPSJkb3h5Z2VuIiwgZG94eWZpbGU9J0RveHlmaWxlJywgLi4uKQorIiIiCisKK2Zyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaGNhc2UKK2ltcG9ydCBvcywgb3MucGF0aCwgcmUsIHN0YXQKK2Zyb20gd2FmbGliIGltcG9ydCBUYXNrLCBVdGlscywgTm9kZSwgTG9ncywgRXJyb3JzLCBCdWlsZAorZnJvbSB3YWZsaWIuVGFza0dlbiBpbXBvcnQgZmVhdHVyZQorCitET1hZX1NUUiA9ICciJHtET1hZR0VOfSIgLSAnCitET1hZX0ZNVFMgPSAnaHRtbCBsYXRleCBtYW4gcmZ0IHhtbCcuc3BsaXQoKQorRE9YWV9GSUxFX1BBVFRFUk5TID0gJyouJyArICcgKi4nLmpvaW4oJycnCitjIGNjIGN4eCBjcHAgYysrIGphdmEgaWkgaXh4IGlwcCBpKysgaW5sIGggaGggaHh4IGhwcCBoKysgaWRsIG9kbCBjcyBwaHAgcGhwMworaW5jIG0gbW0gcHkgZjkwYyBjYyBjeHggY3BwIGMrKyBqYXZhIGlpIGl4eCBpcHAgaSsrIGlubCBoIGhoIGh4eAorJycnLnNwbGl0KCkpCisKK3JlX3JsID0gcmUuY29tcGlsZSgnXFxcXFxyKlxuJywgcmUuTVVMVElMSU5FKQorcmVfbmwgPSByZS5jb21waWxlKCdccipcbicsIHJlLk0pCitkZWYgcGFyc2VfZG94eSh0eHQpOgorCXRibCA9IHt9CisJdHh0ICAgPSByZV9ybC5zdWIoJycsIHR4dCkKKwlsaW5lcyA9IHJlX25sLnNwbGl0KHR4dCkKKwlmb3IgeCBpbiBsaW5lczoKKwkJeCA9IHguc3RyaXAoKQorCQlpZiBub3QgeCBvciB4LnN0YXJ0c3dpdGgoJyMnKSBvciB4LmZpbmQoJz0nKSA8IDA6CisJCQljb250aW51ZQorCQlpZiB4LmZpbmQoJys9JykgPj0gMDoKKwkJCXRtcCA9IHguc3BsaXQoJys9JykKKwkJCWtleSA9IHRtcFswXS5zdHJpcCgpCisJCQlpZiBrZXkgaW4gdGJsOgorCQkJCXRibFtrZXldICs9ICcgJyArICcrPScuam9pbih0bXBbMTpdKS5zdHJpcCgpCisJCQllbHNlOgorCQkJCXRibFtrZXldID0gJys9Jy5qb2luKHRtcFsxOl0pLnN0cmlwKCkKKwkJZWxzZToKKwkJCXRtcCA9IHguc3BsaXQoJz0nKQorCQkJdGJsW3RtcFswXS5zdHJpcCgpXSA9ICc9Jy5qb2luKHRtcFsxOl0pLnN0cmlwKCkKKwlyZXR1cm4gdGJsCisKK2NsYXNzIGRveHlnZW4oVGFzay5UYXNrKToKKwl2YXJzICA9IFsnRE9YWUdFTicsICdET1hZRkxBR1MnXQorCWNvbG9yID0gJ0JMVUUnCisKKwlkZWYgcnVubmFibGVfc3RhdHVzKHNlbGYpOgorCQknJycKKwkJc2VsZi5wYXJzIGFyZSBwb3B1bGF0ZWQgaW4gcnVubmFibGVfc3RhdHVzIC0gYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nCisJCXJ1biAqYmVmb3JlKiBib3RoIHNlbGYucGFycyAiY29uc3VtZXJzIiAtIHNjYW4oKSBhbmQgcnVuKCkKKworCQlzZXQgb3V0cHV0X2RpciAobm9kZSkgZm9yIHRoZSBvdXRwdXQKKwkJJycnCisKKwkJZm9yIHggaW4gc2VsZi5ydW5fYWZ0ZXI6CisJCQlpZiBub3QgeC5oYXNydW46CisJCQkJcmV0dXJuIFRhc2suQVNLX0xBVEVSCisKKwkJaWYgbm90IGdldGF0dHIoc2VsZiwgJ3BhcnMnLCBOb25lKToKKwkJCXR4dCA9IHNlbGYuaW5wdXRzWzBdLnJlYWQoKQorCQkJc2VsZi5wYXJzID0gcGFyc2VfZG94eSh0eHQpCisJCQlpZiBub3Qgc2VsZi5wYXJzLmdldCgnT1VUUFVUX0RJUkVDVE9SWScpOgorCQkJCXNlbGYucGFyc1snT1VUUFVUX0RJUkVDVE9SWSddID0gc2VsZi5pbnB1dHNbMF0ucGFyZW50LmdldF9ibGQoKS5hYnNwYXRoKCkKKworCQkJIyBPdmVycmlkZSB3aXRoIGFueSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgdGFzayBnZW5lcmF0b3IKKwkJCWlmIGdldGF0dHIoc2VsZi5nZW5lcmF0b3IsICdwYXJzJywgTm9uZSk6CisJCQkJZm9yIGssIHYgaW4gc2VsZi5nZW5lcmF0b3IucGFycy5pdGVtcygpOgorCQkJCQlzZWxmLnBhcnNba10gPSB2CisKKwkJCXNlbGYuZG94eV9pbnB1dHMgPSBnZXRhdHRyKHNlbGYsICdkb3h5X2lucHV0cycsIFtdKQorCQkJaWYgbm90IHNlbGYucGFycy5nZXQoJ0lOUFVUJyk6CisJCQkJc2VsZi5kb3h5X2lucHV0cy5hcHBlbmQoc2VsZi5pbnB1dHNbMF0ucGFyZW50KQorCQkJZWxzZToKKwkJCQlmb3IgaSBpbiBzZWxmLnBhcnMuZ2V0KCdJTlBVVCcpLnNwbGl0KCk6CisJCQkJCWlmIG9zLnBhdGguaXNhYnMoaSk6CisJCQkJCQlub2RlID0gc2VsZi5nZW5lcmF0b3IuYmxkLnJvb3QuZmluZF9ub2RlKGkpCisJCQkJCWVsc2U6CisJCQkJCQlub2RlID0gc2VsZi5nZW5lcmF0b3IucGF0aC5maW5kX25vZGUoaSkKKwkJCQkJaWYgbm90IG5vZGU6CisJCQkJCQlzZWxmLmdlbmVyYXRvci5ibGQuZmF0YWwoJ0NvdWxkIG5vdCBmaW5kIHRoZSBkb3h5Z2VuIGlucHV0ICVyJyAlIGkpCisJCQkJCXNlbGYuZG94eV9pbnB1dHMuYXBwZW5kKG5vZGUpCisKKwkJaWYgbm90IGdldGF0dHIoc2VsZiwgJ291dHB1dF9kaXInLCBOb25lKToKKwkJCWJsZCA9IHNlbGYuZ2VuZXJhdG9yLmJsZAorCQkJIyBGaXJzdCB0cnkgdG8gZmluZCBhbiBhYnNvbHV0ZSBwYXRoLCB0aGVuIGZpbmQgb3IgZGVjbGFyZSBhIHJlbGF0aXZlIHBhdGgKKwkJCXNlbGYub3V0cHV0X2RpciA9IGJsZC5yb290LmZpbmRfZGlyKHNlbGYucGFyc1snT1VUUFVUX0RJUkVDVE9SWSddKQorCQkJaWYgbm90IHNlbGYub3V0cHV0X2RpcjoKKwkJCQlzZWxmLm91dHB1dF9kaXIgPSBibGQucGF0aC5maW5kX29yX2RlY2xhcmUoc2VsZi5wYXJzWydPVVRQVVRfRElSRUNUT1JZJ10pCisKKwkJc2VsZi5zaWduYXR1cmUoKQorCQlyZXR1cm4gVGFzay5UYXNrLnJ1bm5hYmxlX3N0YXR1cyhzZWxmKQorCisJZGVmIHNjYW4oc2VsZik6CisJCWV4Y2x1ZGVfcGF0dGVybnMgPSBzZWxmLnBhcnMuZ2V0KCdFWENMVURFX1BBVFRFUk5TJywnJykuc3BsaXQoKQorCQlmaWxlX3BhdHRlcm5zID0gc2VsZi5wYXJzLmdldCgnRklMRV9QQVRURVJOUycsJycpLnNwbGl0KCkKKwkJaWYgbm90IGZpbGVfcGF0dGVybnM6CisJCQlmaWxlX3BhdHRlcm5zID0gRE9YWV9GSUxFX1BBVFRFUk5TCisJCWlmIHNlbGYucGFycy5nZXQoJ1JFQ1VSU0lWRScpID09ICdZRVMnOgorCQkJZmlsZV9wYXR0ZXJucyA9IFsiKiovJXMiICUgcGF0dGVybiBmb3IgcGF0dGVybiBpbiBmaWxlX3BhdHRlcm5zXQorCQlub2RlcyA9IFtdCisJCW5hbWVzID0gW10KKwkJZm9yIG5vZGUgaW4gc2VsZi5kb3h5X2lucHV0czoKKwkJCWlmIG9zLnBhdGguaXNkaXIobm9kZS5hYnNwYXRoKCkpOgorCQkJCWZvciBtIGluIG5vZGUuYW50X2dsb2IoaW5jbD1maWxlX3BhdHRlcm5zLCBleGNsPWV4Y2x1ZGVfcGF0dGVybnMpOgorCQkJCQlub2Rlcy5hcHBlbmQobSkKKwkJCWVsc2U6CisJCQkJbm9kZXMuYXBwZW5kKG5vZGUpCisJCXJldHVybiAobm9kZXMsIG5hbWVzKQorCisJZGVmIHJ1bihzZWxmKToKKwkJZGN0ID0gc2VsZi5wYXJzLmNvcHkoKQorCQlkY3RbJ0lOUFVUJ10gPSAnICcuam9pbihbJyIlcyInICUgeC5hYnNwYXRoKCkgZm9yIHggaW4gc2VsZi5kb3h5X2lucHV0c10pCisJCWNvZGUgPSAnXG4nLmpvaW4oWyclcyA9ICVzJyAlICh4LCBkY3RbeF0pIGZvciB4IGluIHNlbGYucGFyc10pCisJCWNvZGUgPSBjb2RlLmVuY29kZSgpICMgZm9yIHB5dGhvbiAzCisJCSNmbXQgPSBET1hZX1NUUiAlIChzZWxmLmlucHV0c1swXS5wYXJlbnQuYWJzcGF0aCgpKQorCQljbWQgPSBVdGlscy5zdWJzdF92YXJzKERPWFlfU1RSLCBzZWxmLmVudikKKwkJZW52ID0gc2VsZi5lbnYuZW52IG9yIE5vbmUKKwkJcHJvYyA9IFV0aWxzLnN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBzdGRpbj1VdGlscy5zdWJwcm9jZXNzLlBJUEUsIGVudj1lbnYsIGN3ZD1zZWxmLmdlbmVyYXRvci5ibGQucGF0aC5nZXRfYmxkKCkuYWJzcGF0aCgpKQorCQlwcm9jLmNvbW11bmljYXRlKGNvZGUpCisJCXJldHVybiBwcm9jLnJldHVybmNvZGUKKworCWRlZiBwb3N0X3J1bihzZWxmKToKKwkJbm9kZXMgPSBzZWxmLm91dHB1dF9kaXIuYW50X2dsb2IoJyoqLyonLCBxdWlldD1UcnVlKQorCQlmb3IgeCBpbiBub2RlczoKKwkJCXguc2lnID0gVXRpbHMuaF9maWxlKHguYWJzcGF0aCgpKQorCQlzZWxmLm91dHB1dHMgKz0gbm9kZXMKKwkJcmV0dXJuIFRhc2suVGFzay5wb3N0X3J1bihzZWxmKQorCitjbGFzcyB0YXIoVGFzay5UYXNrKToKKwkicXVpY2sgdGFyIGNyZWF0aW9uIgorCXJ1bl9zdHIgPSAnJHtUQVJ9ICR7VEFST1BUU30gJHtUR1R9ICR7U1JDfScKKwljb2xvciAgID0gJ1JFRCcKKwlhZnRlciAgID0gWydkb3h5Z2VuJ10KKwlkZWYgcnVubmFibGVfc3RhdHVzKHNlbGYpOgorCQlmb3IgeCBpbiBnZXRhdHRyKHNlbGYsICdpbnB1dF90YXNrcycsIFtdKToKKwkJCWlmIG5vdCB4Lmhhc3J1bjoKKwkJCQlyZXR1cm4gVGFzay5BU0tfTEFURVIKKworCQlpZiBub3QgZ2V0YXR0cihzZWxmLCAndGFyX2RvbmVfYWRkaW5nJywgTm9uZSk6CisJCQkjIGV4ZWN1dGUgdGhpcyBvbmx5IG9uY2UKKwkJCXNlbGYudGFyX2RvbmVfYWRkaW5nID0gVHJ1ZQorCQkJZm9yIHggaW4gZ2V0YXR0cihzZWxmLCAnaW5wdXRfdGFza3MnLCBbXSk6CisJCQkJc2VsZi5zZXRfaW5wdXRzKHgub3V0cHV0cykKKwkJCWlmIG5vdCBzZWxmLmlucHV0czoKKwkJCQlyZXR1cm4gVGFzay5TS0lQX01FCisJCXJldHVybiBUYXNrLlRhc2sucnVubmFibGVfc3RhdHVzKHNlbGYpCisKKwlkZWYgX19zdHJfXyhzZWxmKToKKwkJdGd0X3N0ciA9ICcgJy5qb2luKFthLm5pY2VfcGF0aChzZWxmLmVudikgZm9yIGEgaW4gc2VsZi5vdXRwdXRzXSkKKwkJcmV0dXJuICclczogJXNcbicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHRndF9zdHIpCisKK0BmZWF0dXJlKCdkb3h5Z2VuJykKK2RlZiBwcm9jZXNzX2RveHkoc2VsZik6CisJaWYgbm90IGdldGF0dHIoc2VsZiwgJ2RveHlmaWxlJywgTm9uZSk6CisJCXNlbGYuZ2VuZXJhdG9yLmJsZC5mYXRhbCgnbm8gZG94eWZpbGU/PycpCisKKwlub2RlID0gc2VsZi5kb3h5ZmlsZQorCWlmIG5vdCBpc2luc3RhbmNlKG5vZGUsIE5vZGUuTm9kZSk6CisJCW5vZGUgPSBzZWxmLnBhdGguZmluZF9yZXNvdXJjZShub2RlKQorCWlmIG5vdCBub2RlOgorCQlyYWlzZSBWYWx1ZUVycm9yKCdkb3h5Z2VuIGZpbGUgbm90IGZvdW5kJykKKworCSMgdGhlIHRhc2sgaW5zdGFuY2UKKwlkc2sgPSBzZWxmLmNyZWF0ZV90YXNrKCdkb3h5Z2VuJywgbm9kZSkKKworCWlmIGdldGF0dHIoc2VsZiwgJ2RveHlfdGFyJywgTm9uZSk6CisJCXRzayA9IHNlbGYuY3JlYXRlX3Rhc2soJ3RhcicpCisJCXRzay5pbnB1dF90YXNrcyA9IFtkc2tdCisJCXRzay5zZXRfb3V0cHV0cyhzZWxmLnBhdGguZmluZF9vcl9kZWNsYXJlKHNlbGYuZG94eV90YXIpKQorCQlpZiBzZWxmLmRveHlfdGFyLmVuZHN3aXRoKCdiejInKToKKwkJCXRzay5lbnZbJ1RBUk9QVFMnXSA9IFsnY2pmJ10KKwkJZWxpZiBzZWxmLmRveHlfdGFyLmVuZHN3aXRoKCdneicpOgorCQkJdHNrLmVudlsnVEFST1BUUyddID0gWydjemYnXQorCQllbHNlOgorCQkJdHNrLmVudlsnVEFST1BUUyddID0gWydjZiddCisKK2RlZiBjb25maWd1cmUoY29uZik6CisJJycnCisJQ2hlY2sgaWYgZG94eWdlbiBhbmQgdGFyIGNvbW1hbmRzIGFyZSBwcmVzZW50IGluIHRoZSBzeXN0ZW0KKworCUlmIHRoZSBjb21tYW5kcyBhcmUgcHJlc2VudCwgdGhlbiBjb25mLmVudi5ET1hZR0VOIGFuZCBjb25mLmVudi5UQVIKKwl2YXJpYWJsZXMgd2lsbCBiZSBzZXQuIERldGVjdGlvbiBjYW4gYmUgY29udHJvbGxlZCBieSBzZXR0aW5nIERPWFlHRU4gYW5kCisJVEFSIGVudmlyb25tZW50YWwgdmFyaWFibGVzLgorCScnJworCisJY29uZi5maW5kX3Byb2dyYW0oJ2RveHlnZW4nLCB2YXI9J0RPWFlHRU4nLCBtYW5kYXRvcnk9RmFsc2UpCisJY29uZi5maW5kX3Byb2dyYW0oJ3RhcicsIHZhcj0nVEFSJywgbWFuZGF0b3J5PUZhbHNlKQorCisjIGRveHlnZW4gZG9jcworZnJvbSB3YWZsaWIuQnVpbGQgaW1wb3J0IEJ1aWxkQ29udGV4dAorY2xhc3MgZG94eShCdWlsZENvbnRleHQpOgorICAgIGNtZCA9ICJkb3h5Z2VuIgorICAgIGZ1biA9ICJkb3h5Z2VuIgpkaWZmIC0tZ2l0IGEvLndhZi10b29scy9wY2gucHkgYi8ud2FmLXRvb2xzL3BjaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGYyOTlmCi0tLSAvZGV2L251bGwKKysrIGIvLndhZi10b29scy9wY2gucHkKQEAgLTAsMCArMSwxNTMgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyMgZW5jb2Rpbmc6IHV0Zi04CisjIEFsZXhhbmRlciBBZmFuYXN5ZXYgKFVDTEEpLCAyMDE0CisKKyIiIgorRW5hYmxlIHByZWNvbXBpbGVkIEMrKyBoZWFkZXIgc3VwcG9ydCAoY3VycmVudGx5IG9ubHkgY2xhbmcrKyBhbmQgZysrIGFyZSBzdXBwb3J0ZWQpCisKK1RvIHVzZSB0aGlzIHRvb2wsIHdzY3JpcHQgc2hvdWxkIGxvb2sgbGlrZToKKworCWRlZiBvcHRpb25zKG9wdCk6CisJCW9wdC5sb2FkKCdwY2gnKQorCQkjIFRoaXMgd2lsbCBhZGQgYC0td2l0aC1wY2hgIGNvbmZpZ3VyZSBvcHRpb24uCisJCSMgVW5sZXNzIC0td2l0aC1wY2ggZHVyaW5nIGNvbmZpZ3VyZSBzdGFnZSBzcGVjaWZpZWQsIHRoZSBwcmVjb21waWxlZCBoZWFkZXIgc3VwcG9ydCBpcyBkaXNhYmxlZAorCisJZGVmIGNvbmZpZ3VyZShjb25mKToKKwkJY29uZi5sb2FkKCdwY2gnKQorCQkjIHRoaXMgd2lsbCBzZXQgY29uZi5lbnYuV0lUSF9QQ0ggaWYgLS13aXRoLXBjaCBpcyBzcGVjaWZpZWQgYW5kIHRoZSBzdXBwb3J0ZWQgY29tcGlsZXIgaXMgdXNlZAorCQkjIFVubGVzcyBjb25mLmVudi5XSVRIX1BDSCBpcyBzZXQsIHRoZSBwcmVjb21waWxlZCBoZWFkZXIgc3VwcG9ydCBpcyBkaXNhYmxlZAorCisJZGVmIGJ1aWxkKGJsZCk6CisJCWJsZChmZWF0dXJlcz0nY3h4IHBjaCcsCisJCQl0YXJnZXQ9J3ByZWNvbXBpbGVkLWhlYWRlcnMnLAorCQkJbmFtZT0ncHJlY29tcGlsZWQtaGVhZGVycycsCisJCQloZWFkZXJzPSdhLmggYi5oIGMuaCcsICMgaGVhZGVycyB0byBwcmUtY29tcGlsZSBpbnRvIGBwcmVjb21waWxlZC1oZWFkZXJzYAorCisJCQkjIE90aGVyIHBhcmFtZXRlcnMgdG8gY29tcGlsZSBwcmVjb21waWxlZCBoZWFkZXJzCisJCQkjIGluY2x1ZGVzPS4uLiwKKwkJCSMgZXhwb3J0X2luY2x1ZGVzPS4uLiwKKwkJCSMgdXNlPS4uLiwKKwkJCSMgLi4uCisKKwkJCSMgRXhwb3J0ZWQgcGFyYW1ldGVycyB3aWxsIGJlIHByb3BhZ2F0ZWQgZXZlbiBpZiBwcmVjb21waWxlZCBoZWFkZXJzIGFyZSBkaXNhYmxlZAorCQkpCisKKwkJYmxkKAorCQkJdGFyZ2V0PSd0ZXN0JywKKwkJCWZlYXR1cmVzPSdjeHggY3h4cHJvZ3JhbScsCisJCQlzb3VyY2U9J2EuY3BwIGIuY3BwIGQuY3BwIG1haW4uY3BwJywKKwkJCXVzZT0ncHJlY29tcGlsZWQtaGVhZGVycycsCisJCSkKKworCQkjIG9yCisKKwkJYmxkKAorCQkJdGFyZ2V0PSd0ZXN0JywKKwkJCWZlYXR1cmVzPSdwY2ggY3h4IGN4eHByb2dyYW0nLAorCQkJc291cmNlPSdhLmNwcCBiLmNwcCBkLmNwcCBtYWluLmNwcCcsCisJCQloZWFkZXJzPSdhLmggYi5oIGMuaCcsCisJCSkKKworTm90ZSB0aGF0IHByZWNvbXBpbGVkIGhlYWRlciBtdXN0IGhhdmUgbXVsdGlwbGUgaW5jbHVzaW9uIGd1YXJkcy4gIElmIHRoZSBndWFyZHMgYXJlIG1pc3NpbmcsIGFueSBiZW5lZml0IG9mIHByZWNvbXBpbGVkIGhlYWRlciB3aWxsIGJlIHZvaWRlZCBhbmQgY29tcGlsYXRpb24gbWF5IGZhaWwgaW4gc29tZSBjYXNlcy4KKyIiIgorCitpbXBvcnQgb3MKK2Zyb20gd2FmbGliIGltcG9ydCBUYXNrLCBUYXNrR2VuLCBMb2dzLCBVdGlscworZnJvbSB3YWZsaWIuVG9vbHMgaW1wb3J0IGNfcHJlcHJvYywgY3h4CisKKworUENIX0NPTVBJTEVSX09QVElPTlMgPSB7CisJJ2NsYW5nKysnOiBbWyctaW5jbHVkZSddLCAnLnBjaCcsIFsnLXgnLCAnYysrLWhlYWRlciddXSwKKwknZysrJzogICAgIFtbJy1pbmNsdWRlJ10sICcuZ2NoJywgWycteCcsICdjKystaGVhZGVyJ11dLAorfQorCisKK2RlZiBvcHRpb25zKG9wdCk6CisJb3B0LmFkZF9vcHRpb24oJy0td2l0aG91dC1wY2gnLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywgZGVmYXVsdD1UcnVlLCBkZXN0PSd3aXRoX3BjaCcsIGhlbHA9JycnVHJ5IHRvIHVzZSBwcmVjb21waWxlZCBoZWFkZXIgdG8gc3BlZWQgdXAgY29tcGlsYXRpb24gKG9ubHkgZysrIGFuZCBjbGFuZysrKScnJykKKworZGVmIGNvbmZpZ3VyZShjb25mKToKKwlpZiAoY29uZi5vcHRpb25zLndpdGhfcGNoIGFuZCBjb25mLmVudlsnQ09NUElMRVJfQ1hYJ10gaW4gUENIX0NPTVBJTEVSX09QVElPTlMua2V5cygpKToKKwkJaWYgVXRpbHMudW52ZXJzaW9uZWRfc3lzX3BsYXRmb3JtKCkgPT0gImRhcndpbiIgYW5kIGNvbmYuZW52WydDWFhfTkFNRSddID09ICdjbGFuZyc6CisJCQl2ZXJzaW9uID0gdHVwbGUoaW50KGkpIGZvciBpIGluIGNvbmYuZW52WydDQ19WRVJTSU9OJ10pCisJCQlpZiB2ZXJzaW9uIDwgKDYsIDEsIDApOgorCQkJCSMgSXNzdWUgIzI4MDQKKwkJCQlyZXR1cm4KKwkJY29uZi5lbnYuV0lUSF9QQ0ggPSBUcnVlCisJCWZsYWdzID0gUENIX0NPTVBJTEVSX09QVElPTlNbY29uZi5lbnZbJ0NPTVBJTEVSX0NYWCddXQorCQljb25mLmVudi5DWFhQQ0hfRiA9IGZsYWdzWzBdCisJCWNvbmYuZW52LkNYWFBDSF9FWFQgPSBmbGFnc1sxXQorCQljb25mLmVudi5DWFhQQ0hfRkxBR1MgPSBmbGFnc1syXQorCisKK0BUYXNrR2VuLmZlYXR1cmUoJ3BjaCcpCitAVGFza0dlbi5iZWZvcmUoJ3Byb2Nlc3Nfc291cmNlJykKK2RlZiBhcHBseV9wY2goc2VsZik6CisJaWYgbm90IHNlbGYuZW52LldJVEhfUENIOgorCQlyZXR1cm4KKworCWlmIGdldGF0dHIoc2VsZi5ibGQsICdwY2hfdGFza3MnLCBOb25lKSBpcyBOb25lOgorCQlzZWxmLmJsZC5wY2hfdGFza3MgPSB7fQorCisJaWYgZ2V0YXR0cihzZWxmLCAnaGVhZGVycycsIE5vbmUpIGlzIE5vbmU6CisJCXJldHVybgorCisJc2VsZi5oZWFkZXJzID0gc2VsZi50b19ub2RlcyhzZWxmLmhlYWRlcnMpCisKKwlpZiBnZXRhdHRyKHNlbGYsICduYW1lJywgTm9uZSk6CisJCXRyeToKKwkJCXRhc2sgPSBzZWxmLmJsZC5wY2hfdGFza3Nbc2VsZi5uYW1lXQorCQkJc2VsZi5ibGQuZmF0YWwoIkR1cGxpY2F0ZWQgJ3BjaCcgdGFzayB3aXRoIG5hbWUgJXIiICUgc2VsZi5uYW1lKQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQlwYXNzCisKKwlvdXQgPSAnJXMuJWQlcycgJSAoc2VsZi50YXJnZXQsIHNlbGYuaWR4LCBzZWxmLmVudlsnQ1hYUENIX0VYVCddKQorCW91dCA9IHNlbGYucGF0aC5maW5kX29yX2RlY2xhcmUob3V0KQorCXRhc2sgPSBzZWxmLmNyZWF0ZV90YXNrKCdnY2h4Jywgc2VsZi5oZWFkZXJzLCBvdXQpCisKKwkjIHRhcmdldCBzaG91bGQgYmUgYW4gYWJzb2x1dGUgcGF0aCBvZiBgb3V0YCwgYnV0IHdpdGhvdXQgcHJlY29tcGlsZWQgaGVhZGVyIGV4dGVuc2lvbgorCXRhc2sudGFyZ2V0ID0gb3V0LmFic3BhdGgoKVs6LWxlbihvdXQuc3VmZml4KCkpXQorCisJc2VsZi5wY2hfdGFzayA9IHRhc2sKKwlpZiBnZXRhdHRyKHNlbGYsICduYW1lJywgTm9uZSk6CisJCXNlbGYuYmxkLnBjaF90YXNrc1tzZWxmLm5hbWVdID0gdGFzaworCitAVGFza0dlbi5mZWF0dXJlKCdjeHgnKQorQFRhc2tHZW4uYWZ0ZXJfbWV0aG9kKCdwcm9jZXNzX3NvdXJjZScsICdwcm9wYWdhdGVfdXNlbGliX3ZhcnMnKQorZGVmIGFkZF9wY2goc2VsZik6CisJaWYgbm90IChzZWxmLmVudlsnV0lUSF9QQ0gnXSBhbmQgZ2V0YXR0cihzZWxmLCAndXNlJywgTm9uZSkgYW5kIGdldGF0dHIoc2VsZiwgJ2NvbXBpbGVkX3Rhc2tzJywgTm9uZSkgYW5kIGdldGF0dHIoc2VsZi5ibGQsICdwY2hfdGFza3MnLCBOb25lKSk6CisJCXJldHVybgorCisJcGNoID0gTm9uZQorCSMgZmluZCBwY2ggdGFzaywgaWYgYW55CisKKwlpZiBnZXRhdHRyKHNlbGYsICdwY2hfdGFzaycsIE5vbmUpOgorCQlwY2ggPSBzZWxmLnBjaF90YXNrCisJZWxzZToKKwkJZm9yIHVzZSBpbiBVdGlscy50b19saXN0KHNlbGYudXNlKToKKwkJCXRyeToKKwkJCQlwY2ggPSBzZWxmLmJsZC5wY2hfdGFza3NbdXNlXQorCQkJZXhjZXB0IEtleUVycm9yOgorCQkJCXBhc3MKKworCWlmIHBjaDoKKwkJZm9yIHggaW4gc2VsZi5jb21waWxlZF90YXNrczoKKwkJCXguZW52LmFwcGVuZF92YWx1ZSgnQ1hYRkxBR1MnLCBzZWxmLmVudlsnQ1hYUENIX0YnXSArIFtwY2gudGFyZ2V0XSkKKworY2xhc3MgZ2NoeChUYXNrLlRhc2spOgorCXJ1bl9zdHIgPSAnJHtDWFh9ICR7QVJDSF9TVDpBUkNIfSAke0NYWEZMQUdTfSAke0NQUEZMQUdTfSAke0NYWFBDSF9GTEFHU30gJHtGUkFNRVdPUktQQVRIX1NUOkZSQU1FV09SS1BBVEh9ICR7Q1BQUEFUSF9TVDpJTkNQQVRIU30gJHtERUZJTkVTX1NUOkRFRklORVN9ICR7Q1hYUENIX0Y6U1JDfSAke0NYWF9TUkNfRn0ke1NSQ1swXS5hYnNwYXRoKCl9ICR7Q1hYX1RHVF9GfSR7VEdUWzBdLmFic3BhdGgoKX0nCisJc2NhbiAgICA9IGNfcHJlcHJvYy5zY2FuCisJY29sb3IgICA9ICdCTFVFJworCWV4dF9vdXQ9WycuaCddCisKKwlkZWYgcnVubmFibGVfc3RhdHVzKHNlbGYpOgorCQl0cnk6CisJCQlub2RlX2RlcHMgPSBzZWxmLmdlbmVyYXRvci5ibGQubm9kZV9kZXBzW3NlbGYudWlkKCldCisJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCW5vZGVfZGVwcyA9IFtdCisJCXJldCA9IFRhc2suVGFzay5ydW5uYWJsZV9zdGF0dXMoc2VsZikKKwkJaWYgcmV0ID09IFRhc2suU0tJUF9NRSBhbmQgc2VsZi5lbnYuQ1hYX05BTUUgPT0gJ2NsYW5nJzoKKwkJCXQgPSBvcy5zdGF0KHNlbGYub3V0cHV0c1swXS5hYnNwYXRoKCkpLnN0X210aW1lCisJCQlmb3IgbiBpbiBzZWxmLmlucHV0cyArIG5vZGVfZGVwczoKKwkJCQlpZiBvcy5zdGF0KG4uYWJzcGF0aCgpKS5zdF9tdGltZSA+IHQ6CisJCQkJCXJldHVybiBUYXNrLlJVTl9NRQorCQlyZXR1cm4gcmV0CmRpZmYgLS1naXQgYS8ud2FmLXRvb2xzL3Nhbml0aXplcnMucHkgYi8ud2FmLXRvb2xzL3Nhbml0aXplcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmZTU1ZAotLS0gL2Rldi9udWxsCisrKyBiLy53YWYtdG9vbHMvc2FuaXRpemVycy5weQpAQCAtMCwwICsxLDIyIEBACisjIC0qLSBNb2RlOiBweXRob247IHB5LWluZGVudC1vZmZzZXQ6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbDsgY29kaW5nOiB1dGYtODsgLSotCisKK2RlZiBvcHRpb25zKG9wdCk6CisgICAgb3B0LmFkZF9vcHRpb24oJy0td2l0aC1zYW5pdGl6ZXInLCBhY3Rpb249J3N0b3JlJywgZGVmYXVsdD0nJywgZGVzdD0nc2FuaXRpemVycycsCisgICAgICAgICAgICAgICAgICAgaGVscD0nQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29tcGlsZXIgc2FuaXRpemVycyB0byBlbmFibGUgW2RlZmF1bHQ9bm9uZV0nKQorCitkZWYgY29uZmlndXJlKGNvbmYpOgorICAgIGZvciBzYW4gaW4gY29uZi5vcHRpb25zLnNhbml0aXplcnMuc3BsaXQoJywnKToKKyAgICAgICAgaWYgbm90IHNhbjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgc2FuZmxhZyA9ICctZnNhbml0aXplPSVzJyAlIHNhbgorICAgICAgICBjb25mLnN0YXJ0X21zZygnQ2hlY2tpbmcgaWYgY29tcGlsZXIgc3VwcG9ydHMgJXMnICUgc2FuZmxhZykKKworICAgICAgICBpZiBjb25mLmNoZWNrX2N4eChjeHhmbGFncz1bJy1XZXJyb3InLCBzYW5mbGFnLCAnLWZuby1vbWl0LWZyYW1lLXBvaW50ZXInXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2ZsYWdzPVtzYW5mbGFnXSwgbWFuZGF0b3J5PUZhbHNlKToKKyAgICAgICAgICAgIGNvbmYuZW5kX21zZygneWVzJykKKyAgICAgICAgICAgIGNvbmYuZW52LmFwcGVuZF91bmlxdWUoJ0NYWEZMQUdTJywgW3NhbmZsYWcsICctZm5vLW9taXQtZnJhbWUtcG9pbnRlciddKQorICAgICAgICAgICAgY29uZi5lbnYuYXBwZW5kX3VuaXF1ZSgnTElOS0ZMQUdTJywgW3NhbmZsYWddKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29uZi5lbmRfbXNnKCdubycsIGNvbG9yPSdSRUQnKQorICAgICAgICAgICAgY29uZi5mYXRhbCgnJXMgc2FuaXRpemVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgY29tcGlsZXInICUgc2FuKQpkaWZmIC0tZ2l0IGEvLndhZi10b29scy9zcGhpbnhfYnVpbGQucHkgYi8ud2FmLXRvb2xzL3NwaGlueF9idWlsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjFkYTZlCi0tLSAvZGV2L251bGwKKysrIGIvLndhZi10b29scy9zcGhpbnhfYnVpbGQucHkKQEAgLTAsMCArMSw3OSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIGVuY29kaW5nOiB1dGYtOAorCisjIGluc3BpcmVkIGJ5IGNvZGUgYnkgSGFucy1NYXJ0aW4gdm9uIEdhdWRlY2tlciwgMjAxMgorCitpbXBvcnQgb3MKK2Zyb20gd2FmbGliIGltcG9ydCBOb2RlLCBUYXNrLCBUYXNrR2VuLCBFcnJvcnMsIExvZ3MsIEJ1aWxkLCBVdGlscworCitjbGFzcyBzcGhpbnhfYnVpbGQoVGFzay5UYXNrKToKKyAgICBjb2xvciA9ICdCTFVFJworICAgIHJ1bl9zdHIgPSAnJHtTUEhJTlhfQlVJTER9IC1EICR7VkVSU0lPTn0gLUQgJHtSRUxFQVNFfSAtcSAtYiAke0JVSUxERVJOQU1FfSAtZCAke0RPQ1RSRUVESVJ9ICR7U1JDRElSfSAke09VVERJUn0nCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgZW52ID0gc2VsZi5lbnYKKyAgICAgICAgc3JjX3N0ciA9ICcgJy5qb2luKFthLnBhdGhfZnJvbShhLmN0eC5sYXVuY2hfbm9kZSgpKSBmb3IgYSBpbiBzZWxmLmlucHV0c10pCisgICAgICAgIHRndF9zdHIgPSAnICcuam9pbihbYS5wYXRoX2Zyb20oYS5jdHgubGF1bmNoX25vZGUoKSkgZm9yIGEgaW4gc2VsZi5vdXRwdXRzXSkKKyAgICAgICAgaWYgc2VsZi5vdXRwdXRzOiBzZXAgPSAnIC0+ICcKKyAgICAgICAgZWxzZTogc2VwID0gJycKKyAgICAgICAgcmV0dXJuJyVzIFslc106ICVzJXMlc1xuJyUoc2VsZi5fX2NsYXNzX18uX19uYW1lX18ucmVwbGFjZSgnX3Rhc2snLCcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnZbJ0JVSUxERVJOQU1FJ10sIHNyY19zdHIsIHNlcCwgdGd0X3N0cikKKworQFRhc2tHZW4uZXh0ZW5zaW9uKCcucHknLCAnLnJzdCcpCitkZWYgc2lnX2hvb2soc2VsZiwgbm9kZSk6CisgICAgbm9kZS5zaWc9VXRpbHMuaF9maWxlKG5vZGUuYWJzcGF0aCgpKQorCitAVGFza0dlbi5mZWF0dXJlKCJzcGhpbngiKQorQFRhc2tHZW4uYmVmb3JlX21ldGhvZCgicHJvY2Vzc19zb3VyY2UiKQorZGVmIGFwcGx5X3NwaGlueChzZWxmKToKKyAgICAiIiJTZXQgdXAgdGhlIHRhc2sgZ2VuZXJhdG9yIHdpdGggYSBTcGhpbnggaW5zdGFuY2UgYW5kIGNyZWF0ZSBhIHRhc2suIiIiCisKKyAgICBpbnB1dHMgPSBbXQorICAgIGZvciBpIGluIFV0aWxzLnRvX2xpc3Qoc2VsZi5zb3VyY2UpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpLCBOb2RlLk5vZGUpOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYucGF0aC5maW5kX25vZGUobm9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5vZGUgPSBpCisgICAgICAgIGlmIG5vdCBub2RlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignWyVzXSBmaWxlIG5vdCBmb3VuZCcgJSBpKQorICAgICAgICBpbnB1dHMuYXBwZW5kKG5vZGUpCisKKyAgICB0YXNrID0gc2VsZi5jcmVhdGVfdGFzaygnc3BoaW54X2J1aWxkJywgaW5wdXRzKQorCisgICAgY29uZiA9IHNlbGYucGF0aC5maW5kX25vZGUoc2VsZi5jb25maWcpCisgICAgdGFzay5pbnB1dHMuYXBwZW5kKGNvbmYpCisKKyAgICBjb25mZGlyID0gY29uZi5wYXJlbnQuYWJzcGF0aCgpCisgICAgYnVpbGRlcm5hbWUgPSBnZXRhdHRyKHNlbGYsICJidWlsZGVyIiwgImh0bWwiKQorICAgIHNyY2RpciA9IGdldGF0dHIoc2VsZiwgInNyY2RpciIsIGNvbmZkaXIpCisgICAgb3V0ZGlyID0gc2VsZi5wYXRoLmZpbmRfb3JfZGVjbGFyZShnZXRhdHRyKHNlbGYsICJvdXRkaXIiLCBidWlsZGVybmFtZSkpLmdldF9ibGQoKQorICAgIGRvY3RyZWVkaXIgPSBnZXRhdHRyKHNlbGYsICJkb2N0cmVlZGlyIiwgb3MucGF0aC5qb2luKG91dGRpci5hYnNwYXRoKCksICIuZG9jdHJlZXMiKSkKKworICAgIHRhc2suZW52WydCVUlMREVSTkFNRSddID0gYnVpbGRlcm5hbWUKKyAgICB0YXNrLmVudlsnU1JDRElSJ10gPSBzcmNkaXIKKyAgICB0YXNrLmVudlsnRE9DVFJFRURJUiddID0gZG9jdHJlZWRpcgorICAgIHRhc2suZW52WydPVVRESVInXSA9IG91dGRpci5hYnNwYXRoKCkKKyAgICB0YXNrLmVudlsnVkVSU0lPTiddID0gInZlcnNpb249JXMiICUgc2VsZi5WRVJTSU9OCisgICAgdGFzay5lbnZbJ1JFTEVBU0UnXSA9ICJyZWxlYXNlPSVzIiAlIHNlbGYuVkVSU0lPTgorCisgICAgaW1wb3J0IGltcAorICAgIGNvbmZEYXRhID0gaW1wLmxvYWRfc291cmNlKCdzcGhpbnhfY29uZicsIGNvbmYuYWJzcGF0aCgpKQorCisgICAgaWYgYnVpbGRlcm5hbWUgPT0gIm1hbiI6CisgICAgICAgIGZvciBpIGluIGNvbmZEYXRhLm1hbl9wYWdlczoKKyAgICAgICAgICAgIHRhcmdldCA9IG91dGRpci5maW5kX29yX2RlY2xhcmUoJyVzLiVkJyAlIChpWzFdLCBpWzRdKSkKKyAgICAgICAgICAgIHRhc2sub3V0cHV0cy5hcHBlbmQodGFyZ2V0KQorCisgICAgICAgICAgICBpZiBzZWxmLmluc3RhbGxfcGF0aDoKKyAgICAgICAgICAgICAgICBzZWxmLmJsZC5pbnN0YWxsX2ZpbGVzKCIlcy9tYW4lZC8iICUgKHNlbGYuaW5zdGFsbF9wYXRoLCBpWzRdKSwgdGFyZ2V0KQorICAgIGVsc2U6CisgICAgICAgIHRhc2sub3V0cHV0cy5hcHBlbmQob3V0ZGlyKQorCitkZWYgY29uZmlndXJlKGNvbmYpOgorICAgIGNvbmYuZmluZF9wcm9ncmFtKCdzcGhpbngtYnVpbGQnLCB2YXI9J1NQSElOWF9CVUlMRCcsIG1hbmRhdG9yeT1GYWxzZSkKKworIyBzcGhpbnggZG9jcworZnJvbSB3YWZsaWIuQnVpbGQgaW1wb3J0IEJ1aWxkQ29udGV4dAorY2xhc3Mgc3BoaW54KEJ1aWxkQ29udGV4dCk6CisgICAgY21kID0gInNwaGlueCIKKyAgICBmdW4gPSAic3BoaW54IgpkaWZmIC0tZ2l0IGEvQVVUSE9SUy5tZCBiL0FVVEhPUlMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkMTg3NwotLS0gL2Rldi9udWxsCisrKyBiL0FVVEhPUlMubWQKQEAgLTAsMCArMSwxNSBAQAorUFN5bmMgYXV0aG9ycworPT09PT09PT09PT09PQorCisjIyBBdXRob3Iocyk6CisKKyogQXNobGVzaCBHYXdhbmRlIDxodHRwczovL3d3dy5saW5rZWRpbi5jb20vaW4vYWdhd2FuZGU+CisqIE1pbnNoZW5nIFpoYW5nICA8aHR0cHM6Ly93d3cubGlua2VkaW4uY29tL2luL21pbnNoZW5nLXpoYW5nLTAzMjAyM2ExPgorCisjIyBUZWNobmljYWwgYWR2aXNvcihzKToKKworKiBMYW4gV2FuZyA8aHR0cDovL3d3dy5jcy5tZW1waGlzLmVkdS9+bGFud2FuZy8+CisKKyMjIFNwZWNpYWwgdGhhbmtzIHRvOgorCisqIERhdmlkZSBQZXNhdmVudG8gPGh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9kYXZpZGVwZXNhdmVudG8+CmRpZmYgLS1naXQgYS9DT1BZSU5HLm1kIGIvQ09QWUlORy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODExZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvQ09QWUlORy5tZApAQCAtMCwwICsxLDg2MCBAQAorUFN5bmMgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCit2ZXJzaW9uIDMgb3IgbGF0ZXIuCisKK1BTeW5jIHJlbGllcyBvbiB0aGlyZC1wYXJ0eSBzb2Z0d2FyZSwgbGljZW5zZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlczoKKworLSBUaGUgQm9vc3QgbGlicmFyaWVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgIFtCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMF0oaHR0cHM6Ly93d3cuYm9vc3Qub3JnL3VzZXJzL2xpY2Vuc2UuaHRtbCkKKworLSBuZG4tY3h4IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBjb25kaXRpb25zIG9mCisgIFtMR1BMIDMuMF0oaHR0cHM6Ly9naXRodWIuY29tL25hbWVkLWRhdGEvbmRuLWN4eC9ibG9iL21hc3Rlci9DT1BZSU5HLm1kKQorCistIFRoZSB3YWYgYnVpbGQgc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAgW0JTRCBsaWNlbnNlXShodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG4tY3h4L2Jsb2IvbWFzdGVyL3dhZikKKworLSBJQkxUIChJbnZlcnRpYmxlIEJsb29tIExvb2t1cCBUYWJsZSkgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICBbTUlUIGxpY2Vuc2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9nYXZpbmFuZHJlc2VuL0lCTFRfQ3BsdXNwbHVzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpCisKKy0gQmxvb20gaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICBbTUlUIGxpY2Vuc2VdKGh0dHA6Ly93d3cucGFydG93Lm5ldC9wcm9ncmFtbWluZy9ibG9vbWZpbHRlci9pbmRleC5odG1sKQorCitUaGUgTEdQTCBhbmQgR1BMIGxpY2Vuc2VzIGFyZSBwcm92aWRlZCBiZWxvdyBpbiB0aGlzIGZpbGUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbgorYWJvdXQgdGhlc2UgbGljZW5zZXMsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIyMgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisKK1ZlcnNpb24gMywgMjkgSnVuZSAyMDA3CisKK0NvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKzxodHRwczovL2ZzZi5vcmcvPgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcworbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitUaGlzIHZlcnNpb24gb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbmNvcnBvcmF0ZXMgdGhlCit0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorc3VwcGxlbWVudGVkIGJ5IHRoZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGxpc3RlZCBiZWxvdy4KKworIyMjIyAwLiBBZGRpdGlvbmFsIERlZmluaXRpb25zLgorCitBcyB1c2VkIGhlcmVpbiwgInRoaXMgTGljZW5zZSIgcmVmZXJzIHRvIHZlcnNpb24gMyBvZiB0aGUgR05VIExlc3NlcgorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYW5kIHRoZSAiR05VIEdQTCIgcmVmZXJzIHRvIHZlcnNpb24gMyBvZiB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisiVGhlIExpYnJhcnkiIHJlZmVycyB0byBhIGNvdmVyZWQgd29yayBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UsIG90aGVyCit0aGFuIGFuIEFwcGxpY2F0aW9uIG9yIGEgQ29tYmluZWQgV29yayBhcyBkZWZpbmVkIGJlbG93LgorCitBbiAiQXBwbGljYXRpb24iIGlzIGFueSB3b3JrIHRoYXQgbWFrZXMgdXNlIG9mIGFuIGludGVyZmFjZSBwcm92aWRlZAorYnkgdGhlIExpYnJhcnksIGJ1dCB3aGljaCBpcyBub3Qgb3RoZXJ3aXNlIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorRGVmaW5pbmcgYSBzdWJjbGFzcyBvZiBhIGNsYXNzIGRlZmluZWQgYnkgdGhlIExpYnJhcnkgaXMgZGVlbWVkIGEgbW9kZQorb2YgdXNpbmcgYW4gaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoZSBMaWJyYXJ5LgorCitBICJDb21iaW5lZCBXb3JrIiBpcyBhIHdvcmsgcHJvZHVjZWQgYnkgY29tYmluaW5nIG9yIGxpbmtpbmcgYW4KK0FwcGxpY2F0aW9uIHdpdGggdGhlIExpYnJhcnkuIFRoZSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlIExpYnJhcnkKK3dpdGggd2hpY2ggdGhlIENvbWJpbmVkIFdvcmsgd2FzIG1hZGUgaXMgYWxzbyBjYWxsZWQgdGhlICJMaW5rZWQKK1ZlcnNpb24iLgorCitUaGUgIk1pbmltYWwgQ29ycmVzcG9uZGluZyBTb3VyY2UiIGZvciBhIENvbWJpbmVkIFdvcmsgbWVhbnMgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgdGhlIENvbWJpbmVkIFdvcmssIGV4Y2x1ZGluZyBhbnkgc291cmNlIGNvZGUKK2ZvciBwb3J0aW9ucyBvZiB0aGUgQ29tYmluZWQgV29yayB0aGF0LCBjb25zaWRlcmVkIGluIGlzb2xhdGlvbiwgYXJlCitiYXNlZCBvbiB0aGUgQXBwbGljYXRpb24sIGFuZCBub3Qgb24gdGhlIExpbmtlZCBWZXJzaW9uLgorCitUaGUgIkNvcnJlc3BvbmRpbmcgQXBwbGljYXRpb24gQ29kZSIgZm9yIGEgQ29tYmluZWQgV29yayBtZWFucyB0aGUKK29iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSBmb3IgdGhlIEFwcGxpY2F0aW9uLCBpbmNsdWRpbmcgYW55IGRhdGEKK2FuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IgcmVwcm9kdWNpbmcgdGhlIENvbWJpbmVkIFdvcmsgZnJvbSB0aGUKK0FwcGxpY2F0aW9uLCBidXQgZXhjbHVkaW5nIHRoZSBTeXN0ZW0gTGlicmFyaWVzIG9mIHRoZSBDb21iaW5lZCBXb3JrLgorCisjIyMjIDEuIEV4Y2VwdGlvbiB0byBTZWN0aW9uIDMgb2YgdGhlIEdOVSBHUEwuCisKK1lvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIHVuZGVyIHNlY3Rpb25zIDMgYW5kIDQgb2YgdGhpcyBMaWNlbnNlCit3aXRob3V0IGJlaW5nIGJvdW5kIGJ5IHNlY3Rpb24gMyBvZiB0aGUgR05VIEdQTC4KKworIyMjIyAyLiBDb252ZXlpbmcgTW9kaWZpZWQgVmVyc2lvbnMuCisKK0lmIHlvdSBtb2RpZnkgYSBjb3B5IG9mIHRoZSBMaWJyYXJ5LCBhbmQsIGluIHlvdXIgbW9kaWZpY2F0aW9ucywgYQorZmFjaWxpdHkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBBcHBsaWNhdGlvbgordGhhdCB1c2VzIHRoZSBmYWNpbGl0eSAob3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUKK2ZhY2lsaXR5IGlzIGludm9rZWQpLCB0aGVuIHlvdSBtYXkgY29udmV5IGEgY29weSBvZiB0aGUgbW9kaWZpZWQKK3ZlcnNpb246CisKKy0gICBhKSB1bmRlciB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgeW91IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydAorICAgIHRvIGVuc3VyZSB0aGF0LCBpbiB0aGUgZXZlbnQgYW4gQXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHRoZQorICAgIGZ1bmN0aW9uIG9yIGRhdGEsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zCisgICAgd2hhdGV2ZXIgcGFydCBvZiBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwsIG9yCistICAgYikgdW5kZXIgdGhlIEdOVSBHUEwsIHdpdGggbm9uZSBvZiB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvZgorICAgIHRoaXMgTGljZW5zZSBhcHBsaWNhYmxlIHRvIHRoYXQgY29weS4KKworIyMjIyAzLiBPYmplY3QgQ29kZSBJbmNvcnBvcmF0aW5nIE1hdGVyaWFsIGZyb20gTGlicmFyeSBIZWFkZXIgRmlsZXMuCisKK1RoZSBvYmplY3QgY29kZSBmb3JtIG9mIGFuIEFwcGxpY2F0aW9uIG1heSBpbmNvcnBvcmF0ZSBtYXRlcmlhbCBmcm9tIGEKK2hlYWRlciBmaWxlIHRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeS4gWW91IG1heSBjb252ZXkgc3VjaCBvYmplY3QKK2NvZGUgdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQsIGlmIHRoZSBpbmNvcnBvcmF0ZWQKK21hdGVyaWFsIGlzIG5vdCBsaW1pdGVkIHRvIG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhIHN0cnVjdHVyZQorbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBvciBzbWFsbCBtYWNyb3MsIGlubGluZSBmdW5jdGlvbnMgYW5kIHRlbXBsYXRlcworKHRlbiBvciBmZXdlciBsaW5lcyBpbiBsZW5ndGgpLCB5b3UgZG8gYm90aCBvZiB0aGUgZm9sbG93aW5nOgorCistICAgYSkgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBvYmplY3QgY29kZSB0aGF0CisgICAgdGhlIExpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUKKyAgICBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KKy0gICBiKSBBY2NvbXBhbnkgdGhlIG9iamVjdCBjb2RlIHdpdGggYSBjb3B5IG9mIHRoZSBHTlUgR1BMIGFuZCB0aGlzCisgICAgbGljZW5zZSBkb2N1bWVudC4KKworIyMjIyA0LiBDb21iaW5lZCBXb3Jrcy4KKworWW91IG1heSBjb252ZXkgYSBDb21iaW5lZCBXb3JrIHVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlIHRoYXQsIHRha2VuCit0b2dldGhlciwgZWZmZWN0aXZlbHkgZG8gbm90IHJlc3RyaWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUgcG9ydGlvbnMgb2YKK3RoZSBMaWJyYXJ5IGNvbnRhaW5lZCBpbiB0aGUgQ29tYmluZWQgV29yayBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyBmb3IKK2RlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMsIGlmIHlvdSBhbHNvIGRvIGVhY2ggb2YgdGhlIGZvbGxvd2luZzoKKworLSAgIGEpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgQ29tYmluZWQgV29yayB0aGF0CisgICAgdGhlIExpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUKKyAgICBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KKy0gICBiKSBBY2NvbXBhbnkgdGhlIENvbWJpbmVkIFdvcmsgd2l0aCBhIGNvcHkgb2YgdGhlIEdOVSBHUEwgYW5kIHRoaXMKKyAgICBsaWNlbnNlIGRvY3VtZW50LgorLSAgIGMpIEZvciBhIENvbWJpbmVkIFdvcmsgdGhhdCBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcyBkdXJpbmcKKyAgICBleGVjdXRpb24sIGluY2x1ZGUgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nCisgICAgdGhlc2Ugbm90aWNlcywgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZSBkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlCisgICAgY29waWVzIG9mIHRoZSBHTlUgR1BMIGFuZCB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQuCistICAgZCkgRG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgLSAgIDApIENvbnZleSB0aGUgTWluaW1hbCBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YKKyAgICAgICAgdGhpcyBMaWNlbnNlLCBhbmQgdGhlIENvcnJlc3BvbmRpbmcgQXBwbGljYXRpb24gQ29kZSBpbiBhIGZvcm0KKyAgICAgICAgc3VpdGFibGUgZm9yLCBhbmQgdW5kZXIgdGVybXMgdGhhdCBwZXJtaXQsIHRoZSB1c2VyIHRvCisgICAgICAgIHJlY29tYmluZSBvciByZWxpbmsgdGhlIEFwcGxpY2F0aW9uIHdpdGggYSBtb2RpZmllZCB2ZXJzaW9uIG9mCisgICAgICAgIHRoZSBMaW5rZWQgVmVyc2lvbiB0byBwcm9kdWNlIGEgbW9kaWZpZWQgQ29tYmluZWQgV29yaywgaW4gdGhlCisgICAgICAgIG1hbm5lciBzcGVjaWZpZWQgYnkgc2VjdGlvbiA2IG9mIHRoZSBHTlUgR1BMIGZvciBjb252ZXlpbmcKKyAgICAgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuCisgICAgLSAgIDEpIFVzZSBhIHN1aXRhYmxlIHNoYXJlZCBsaWJyYXJ5IG1lY2hhbmlzbSBmb3IgbGlua2luZyB3aXRoCisgICAgICAgIHRoZSBMaWJyYXJ5LiBBIHN1aXRhYmxlIG1lY2hhbmlzbSBpcyBvbmUgdGhhdCAoYSkgdXNlcyBhdCBydW4KKyAgICAgICAgdGltZSBhIGNvcHkgb2YgdGhlIExpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MKKyAgICAgICAgY29tcHV0ZXIgc3lzdGVtLCBhbmQgKGIpIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQKKyAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGlicmFyeSB0aGF0IGlzIGludGVyZmFjZS1jb21wYXRpYmxlIHdpdGggdGhlCisgICAgICAgIExpbmtlZCBWZXJzaW9uLgorLSAgIGUpIFByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uLCBidXQgb25seSBpZiB5b3Ugd291bGQKKyAgICBvdGhlcndpc2UgYmUgcmVxdWlyZWQgdG8gcHJvdmlkZSBzdWNoIGluZm9ybWF0aW9uIHVuZGVyIHNlY3Rpb24gNgorICAgIG9mIHRoZSBHTlUgR1BMLCBhbmQgb25seSB0byB0aGUgZXh0ZW50IHRoYXQgc3VjaCBpbmZvcm1hdGlvbiBpcworICAgIG5lY2Vzc2FyeSB0byBpbnN0YWxsIGFuZCBleGVjdXRlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUKKyAgICBDb21iaW5lZCBXb3JrIHByb2R1Y2VkIGJ5IHJlY29tYmluaW5nIG9yIHJlbGlua2luZyB0aGUgQXBwbGljYXRpb24KKyAgICB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlua2VkIFZlcnNpb24uIChJZiB5b3UgdXNlIG9wdGlvbgorICAgIDRkMCwgdGhlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBtdXN0IGFjY29tcGFueSB0aGUgTWluaW1hbAorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFuZCBDb3JyZXNwb25kaW5nIEFwcGxpY2F0aW9uIENvZGUuIElmIHlvdQorICAgIHVzZSBvcHRpb24gNGQxLCB5b3UgbXVzdCBwcm92aWRlIHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gaW4KKyAgICB0aGUgbWFubmVyIHNwZWNpZmllZCBieSBzZWN0aW9uIDYgb2YgdGhlIEdOVSBHUEwgZm9yIGNvbnZleWluZworICAgIENvcnJlc3BvbmRpbmcgU291cmNlLikKKworIyMjIyA1LiBDb21iaW5lZCBMaWJyYXJpZXMuCisKK1lvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeQorc2lkZSBieSBzaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIHRoYXQgYXJlIG5vdCBBcHBsaWNhdGlvbnMgYW5kIGFyZSBub3QgY292ZXJlZCBieSB0aGlzCitMaWNlbnNlLCBhbmQgY29udmV5IHN1Y2ggYSBjb21iaW5lZCBsaWJyYXJ5IHVuZGVyIHRlcm1zIG9mIHlvdXIKK2Nob2ljZSwgaWYgeW91IGRvIGJvdGggb2YgdGhlIGZvbGxvd2luZzoKKworLSAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMsIGNvbnZleWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCistICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgdGhhdCBwYXJ0IG9mIGl0CisgICAgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZyB3aGVyZSB0byBmaW5kIHRoZQorICAgIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworIyMjIyA2LiBSZXZpc2VkIFZlcnNpb25zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKK1RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBTdWNoIG5ldwordmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5CitkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gSWYgdGhlIExpYnJhcnkKK2FzIHlvdSByZWNlaXZlZCBpdCBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUKK0dOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iIGFwcGxpZXMgdG8KK2l0LCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyCitvZiB0aGF0IHB1Ymxpc2hlZCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gSWYgdGhlIExpYnJhcnkgYXMgeW91IHJlY2VpdmVkIGl0IGRvZXMgbm90CitzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgeW91CittYXkgY2hvb3NlIGFueSB2ZXJzaW9uIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZXZlcgorcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK0lmIHRoZSBMaWJyYXJ5IGFzIHlvdSByZWNlaXZlZCBpdCBzcGVjaWZpZXMgdGhhdCBhIHByb3h5IGNhbiBkZWNpZGUKK3doZXRoZXIgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugc2hhbGwKK2FwcGx5LCB0aGF0IHByb3h5J3MgcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGFueSB2ZXJzaW9uIGlzCitwZXJtYW5lbnQgYXV0aG9yaXphdGlvbiBmb3IgeW91IHRvIGNob29zZSB0aGF0IHZlcnNpb24gZm9yIHRoZQorTGlicmFyeS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMjIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisKK1ZlcnNpb24gMywgMjkgSnVuZSAyMDA3CisKK0NvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKzxodHRwczovL2ZzZi5vcmcvPgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcworbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisjIyMgUHJlYW1ibGUKKworVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGEgZnJlZSwgY29weWxlZnQgbGljZW5zZSBmb3IKK3NvZnR3YXJlIGFuZCBvdGhlciBraW5kcyBvZiB3b3Jrcy4KKworVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFuZCBvdGhlciBwcmFjdGljYWwgd29ya3MgYXJlIGRlc2lnbmVkCit0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgdGhlIHdvcmtzLiBCeSBjb250cmFzdCwKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tCit0byBzaGFyZSBhbmQgY2hhbmdlIGFsbCB2ZXJzaW9ucyBvZiBhIHByb2dyYW0tLXRvIG1ha2Ugc3VyZSBpdCByZW1haW5zCitmcmVlIHNvZnR3YXJlIGZvciBhbGwgaXRzIHVzZXJzLiBXZSwgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdXNlCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vc3Qgb2Ygb3VyIHNvZnR3YXJlOyBpdCBhcHBsaWVzCithbHNvIHRvIGFueSBvdGhlciB3b3JrIHJlbGVhc2VkIHRoaXMgd2F5IGJ5IGl0cyBhdXRob3JzLiBZb3UgY2FuIGFwcGx5CitpdCB0byB5b3VyIHByb2dyYW1zLCB0b28uCisKK1doZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhlbSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3UKK3dhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3CitmcmVlIHByb2dyYW1zLCBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBwcmV2ZW50IG90aGVycyBmcm9tIGRlbnlpbmcgeW91Cit0aGVzZSByaWdodHMgb3IgYXNraW5nIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gVGhlcmVmb3JlLCB5b3UKK2hhdmUgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKK3NvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0OiByZXNwb25zaWJpbGl0aWVzIHRvIHJlc3BlY3QgdGhlIGZyZWVkb20KK29mIG90aGVycy4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgcGFzcyBvbiB0byB0aGUgcmVjaXBpZW50cyB0aGUgc2FtZQorZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZQorb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleQora25vdyB0aGVpciByaWdodHMuCisKK0RldmVsb3BlcnMgdGhhdCB1c2UgdGhlIEdOVSBHUEwgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczoKKygxKSBhc3NlcnQgY29weXJpZ2h0IG9uIHRoZSBzb2Z0d2FyZSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBMaWNlbnNlCitnaXZpbmcgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IGl0LgorCitGb3IgdGhlIGRldmVsb3BlcnMnIGFuZCBhdXRob3JzJyBwcm90ZWN0aW9uLCB0aGUgR1BMIGNsZWFybHkgZXhwbGFpbnMKK3RoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gRm9yIGJvdGggdXNlcnMnIGFuZAorYXV0aG9ycycgc2FrZSwgdGhlIEdQTCByZXF1aXJlcyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIGJlIG1hcmtlZCBhcworY2hhbmdlZCwgc28gdGhhdCB0aGVpciBwcm9ibGVtcyB3aWxsIG5vdCBiZSBhdHRyaWJ1dGVkIGVycm9uZW91c2x5IHRvCithdXRob3JzIG9mIHByZXZpb3VzIHZlcnNpb25zLgorCitTb21lIGRldmljZXMgYXJlIGRlc2lnbmVkIHRvIGRlbnkgdXNlcnMgYWNjZXNzIHRvIGluc3RhbGwgb3IgcnVuCittb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZQorbWFudWZhY3R1cmVyIGNhbiBkbyBzby4gVGhpcyBpcyBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZQorYWltIG9mIHByb3RlY3RpbmcgdXNlcnMnIGZyZWVkb20gdG8gY2hhbmdlIHRoZSBzb2Z0d2FyZS4gVGhlCitzeXN0ZW1hdGljIHBhdHRlcm4gb2Ygc3VjaCBhYnVzZSBvY2N1cnMgaW4gdGhlIGFyZWEgb2YgcHJvZHVjdHMgZm9yCitpbmRpdmlkdWFscyB0byB1c2UsIHdoaWNoIGlzIHByZWNpc2VseSB3aGVyZSBpdCBpcyBtb3N0IHVuYWNjZXB0YWJsZS4KK1RoZXJlZm9yZSwgd2UgaGF2ZSBkZXNpZ25lZCB0aGlzIHZlcnNpb24gb2YgdGhlIEdQTCB0byBwcm9oaWJpdCB0aGUKK3ByYWN0aWNlIGZvciB0aG9zZSBwcm9kdWN0cy4gSWYgc3VjaCBwcm9ibGVtcyBhcmlzZSBzdWJzdGFudGlhbGx5IGluCitvdGhlciBkb21haW5zLCB3ZSBzdGFuZCByZWFkeSB0byBleHRlbmQgdGhpcyBwcm92aXNpb24gdG8gdGhvc2UKK2RvbWFpbnMgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBHUEwsIGFzIG5lZWRlZCB0byBwcm90ZWN0IHRoZQorZnJlZWRvbSBvZiB1c2Vycy4KKworRmluYWxseSwgZXZlcnkgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUgcGF0ZW50cy4KK1N0YXRlcyBzaG91bGQgbm90IGFsbG93IHBhdGVudHMgdG8gcmVzdHJpY3QgZGV2ZWxvcG1lbnQgYW5kIHVzZSBvZgorc29mdHdhcmUgb24gZ2VuZXJhbC1wdXJwb3NlIGNvbXB1dGVycywgYnV0IGluIHRob3NlIHRoYXQgZG8sIHdlIHdpc2gKK3RvIGF2b2lkIHRoZSBzcGVjaWFsIGRhbmdlciB0aGF0IHBhdGVudHMgYXBwbGllZCB0byBhIGZyZWUgcHJvZ3JhbQorY291bGQgbWFrZSBpdCBlZmZlY3RpdmVseSBwcm9wcmlldGFyeS4gVG8gcHJldmVudCB0aGlzLCB0aGUgR1BMCithc3N1cmVzIHRoYXQgcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCisKK1RoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorCisjIyMgVEVSTVMgQU5EIENPTkRJVElPTlMKKworIyMjIyAwLiBEZWZpbml0aW9ucy4KKworIlRoaXMgTGljZW5zZSIgcmVmZXJzIHRvIHZlcnNpb24gMyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyJDb3B5cmlnaHQiIGFsc28gbWVhbnMgY29weXJpZ2h0LWxpa2UgbGF3cyB0aGF0IGFwcGx5IHRvIG90aGVyIGtpbmRzCitvZiB3b3Jrcywgc3VjaCBhcyBzZW1pY29uZHVjdG9yIG1hc2tzLgorCisiVGhlIFByb2dyYW0iIHJlZmVycyB0byBhbnkgY29weXJpZ2h0YWJsZSB3b3JrIGxpY2Vuc2VkIHVuZGVyIHRoaXMKK0xpY2Vuc2UuIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLiAiTGljZW5zZWVzIiBhbmQKKyJyZWNpcGllbnRzIiBtYXkgYmUgaW5kaXZpZHVhbHMgb3Igb3JnYW5pemF0aW9ucy4KKworVG8gIm1vZGlmeSIgYSB3b3JrIG1lYW5zIHRvIGNvcHkgZnJvbSBvciBhZGFwdCBhbGwgb3IgcGFydCBvZiB0aGUgd29yaworaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mCithbiBleGFjdCBjb3B5LiBUaGUgcmVzdWx0aW5nIHdvcmsgaXMgY2FsbGVkIGEgIm1vZGlmaWVkIHZlcnNpb24iIG9mCit0aGUgZWFybGllciB3b3JrIG9yIGEgd29yayAiYmFzZWQgb24iIHRoZSBlYXJsaWVyIHdvcmsuCisKK0EgImNvdmVyZWQgd29yayIgbWVhbnMgZWl0aGVyIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0gb3IgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbS4KKworVG8gInByb3BhZ2F0ZSIgYSB3b3JrIG1lYW5zIHRvIGRvIGFueXRoaW5nIHdpdGggaXQgdGhhdCwgd2l0aG91dAorcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcgoraW5mcmluZ2VtZW50IHVuZGVyIGFwcGxpY2FibGUgY29weXJpZ2h0IGxhdywgZXhjZXB0IGV4ZWN1dGluZyBpdCBvbiBhCitjb21wdXRlciBvciBtb2RpZnlpbmcgYSBwcml2YXRlIGNvcHkuIFByb3BhZ2F0aW9uIGluY2x1ZGVzIGNvcHlpbmcsCitkaXN0cmlidXRpb24gKHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLCBtYWtpbmcgYXZhaWxhYmxlIHRvIHRoZQorcHVibGljLCBhbmQgaW4gc29tZSBjb3VudHJpZXMgb3RoZXIgYWN0aXZpdGllcyBhcyB3ZWxsLgorCitUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCitwYXJ0aWVzIHRvIG1ha2Ugb3IgcmVjZWl2ZSBjb3BpZXMuIE1lcmUgaW50ZXJhY3Rpb24gd2l0aCBhIHVzZXIKK3Rocm91Z2ggYSBjb21wdXRlciBuZXR3b3JrLCB3aXRoIG5vIHRyYW5zZmVyIG9mIGEgY29weSwgaXMgbm90Citjb252ZXlpbmcuCisKK0FuIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlIGRpc3BsYXlzICJBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzIiB0bwordGhlIGV4dGVudCB0aGF0IGl0IGluY2x1ZGVzIGEgY29udmVuaWVudCBhbmQgcHJvbWluZW50bHkgdmlzaWJsZQorZmVhdHVyZSB0aGF0ICgxKSBkaXNwbGF5cyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlLCBhbmQgKDIpCit0ZWxscyB0aGUgdXNlciB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgd29yayAoZXhjZXB0IHRvIHRoZQorZXh0ZW50IHRoYXQgd2FycmFudGllcyBhcmUgcHJvdmlkZWQpLCB0aGF0IGxpY2Vuc2VlcyBtYXkgY29udmV5IHRoZQord29yayB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiBJZgordGhlIGludGVyZmFjZSBwcmVzZW50cyBhIGxpc3Qgb2YgdXNlciBjb21tYW5kcyBvciBvcHRpb25zLCBzdWNoIGFzIGEKK21lbnUsIGEgcHJvbWluZW50IGl0ZW0gaW4gdGhlIGxpc3QgbWVldHMgdGhpcyBjcml0ZXJpb24uCisKKyMjIyMgMS4gU291cmNlIENvZGUuCisKK1RoZSAic291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICJPYmplY3QgY29kZSIgbWVhbnMgYW55IG5vbi1zb3VyY2UgZm9ybSBvZgorYSB3b3JrLgorCitBICJTdGFuZGFyZCBJbnRlcmZhY2UiIG1lYW5zIGFuIGludGVyZmFjZSB0aGF0IGVpdGhlciBpcyBhbiBvZmZpY2lhbAorc3RhbmRhcmQgZGVmaW5lZCBieSBhIHJlY29nbml6ZWQgc3RhbmRhcmRzIGJvZHksIG9yLCBpbiB0aGUgY2FzZSBvZgoraW50ZXJmYWNlcyBzcGVjaWZpZWQgZm9yIGEgcGFydGljdWxhciBwcm9ncmFtbWluZyBsYW5ndWFnZSwgb25lIHRoYXQKK2lzIHdpZGVseSB1c2VkIGFtb25nIGRldmVsb3BlcnMgd29ya2luZyBpbiB0aGF0IGxhbmd1YWdlLgorCitUaGUgIlN5c3RlbSBMaWJyYXJpZXMiIG9mIGFuIGV4ZWN1dGFibGUgd29yayBpbmNsdWRlIGFueXRoaW5nLCBvdGhlcgordGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKK3BhY2thZ2luZyBhIE1ham9yIENvbXBvbmVudCwgYnV0IHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoYXQgTWFqb3IKK0NvbXBvbmVudCwgYW5kIChiKSBzZXJ2ZXMgb25seSB0byBlbmFibGUgdXNlIG9mIHRoZSB3b3JrIHdpdGggdGhhdAorTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCitpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbiBzb3VyY2UgY29kZSBmb3JtLiBBCisiTWFqb3IgQ29tcG9uZW50IiwgaW4gdGhpcyBjb250ZXh0LCBtZWFucyBhIG1ham9yIGVzc2VudGlhbCBjb21wb25lbnQKKyhrZXJuZWwsIHdpbmRvdyBzeXN0ZW0sIGFuZCBzbyBvbikgb2YgdGhlIHNwZWNpZmljIG9wZXJhdGluZyBzeXN0ZW0KKyhpZiBhbnkpIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHdvcmsgcnVucywgb3IgYSBjb21waWxlciB1c2VkIHRvCitwcm9kdWNlIHRoZSB3b3JrLCBvciBhbiBvYmplY3QgY29kZSBpbnRlcnByZXRlciB1c2VkIHRvIHJ1biBpdC4KKworVGhlICJDb3JyZXNwb25kaW5nIFNvdXJjZSIgZm9yIGEgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIG1lYW5zIGFsbAordGhlIHNvdXJjZSBjb2RlIG5lZWRlZCB0byBnZW5lcmF0ZSwgaW5zdGFsbCwgYW5kIChmb3IgYW4gZXhlY3V0YWJsZQord29yaykgcnVuIHRoZSBvYmplY3QgY29kZSBhbmQgdG8gbW9kaWZ5IHRoZSB3b3JrLCBpbmNsdWRpbmcgc2NyaXB0cyB0bworY29udHJvbCB0aG9zZSBhY3Rpdml0aWVzLiBIb3dldmVyLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3b3JrJ3MKK1N5c3RlbSBMaWJyYXJpZXMsIG9yIGdlbmVyYWwtcHVycG9zZSB0b29scyBvciBnZW5lcmFsbHkgYXZhaWxhYmxlIGZyZWUKK3Byb2dyYW1zIHdoaWNoIGFyZSB1c2VkIHVubW9kaWZpZWQgaW4gcGVyZm9ybWluZyB0aG9zZSBhY3Rpdml0aWVzIGJ1dAord2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JrLiBGb3IgZXhhbXBsZSwgQ29ycmVzcG9uZGluZyBTb3VyY2UKK2luY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yCit0aGUgd29yaywgYW5kIHRoZSBzb3VyY2UgY29kZSBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pY2FsbHkKK2xpbmtlZCBzdWJwcm9ncmFtcyB0aGF0IHRoZSB3b3JrIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byByZXF1aXJlLAorc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UKK3N1YnByb2dyYW1zIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgd29yay4KKworVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCB1c2VycyBjYW4KK3JlZ2VuZXJhdGUgYXV0b21hdGljYWxseSBmcm9tIG90aGVyIHBhcnRzIG9mIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZS4KKworVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhIHdvcmsgaW4gc291cmNlIGNvZGUgZm9ybSBpcyB0aGF0IHNhbWUKK3dvcmsuCisKKyMjIyMgMi4gQmFzaWMgUGVybWlzc2lvbnMuCisKK0FsbCByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UgYXJlIGdyYW50ZWQgZm9yIHRoZSB0ZXJtIG9mCitjb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZAorY29uZGl0aW9ucyBhcmUgbWV0LiBUaGlzIExpY2Vuc2UgZXhwbGljaXRseSBhZmZpcm1zIHlvdXIgdW5saW1pdGVkCitwZXJtaXNzaW9uIHRvIHJ1biB0aGUgdW5tb2RpZmllZCBQcm9ncmFtLiBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhCitjb3ZlcmVkIHdvcmsgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2Ugb25seSBpZiB0aGUgb3V0cHV0LCBnaXZlbiBpdHMKK2NvbnRlbnQsIGNvbnN0aXR1dGVzIGEgY292ZXJlZCB3b3JrLiBUaGlzIExpY2Vuc2UgYWNrbm93bGVkZ2VzIHlvdXIKK3JpZ2h0cyBvZiBmYWlyIHVzZSBvciBvdGhlciBlcXVpdmFsZW50LCBhcyBwcm92aWRlZCBieSBjb3B5cmlnaHQgbGF3LgorCitZb3UgbWF5IG1ha2UsIHJ1biBhbmQgcHJvcGFnYXRlIGNvdmVyZWQgd29ya3MgdGhhdCB5b3UgZG8gbm90IGNvbnZleSwKK3dpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucyBpbiBmb3JjZS4KK1lvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlIG9mIGhhdmluZwordGhlbSBtYWtlIG1vZGlmaWNhdGlvbnMgZXhjbHVzaXZlbHkgZm9yIHlvdSwgb3IgcHJvdmlkZSB5b3Ugd2l0aAorZmFjaWxpdGllcyBmb3IgcnVubmluZyB0aG9zZSB3b3JrcywgcHJvdmlkZWQgdGhhdCB5b3UgY29tcGx5IHdpdGggdGhlCit0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvIG5vdAorY29udHJvbCBjb3B5cmlnaHQuIFRob3NlIHRodXMgbWFraW5nIG9yIHJ1bm5pbmcgdGhlIGNvdmVyZWQgd29ya3MgZm9yCit5b3UgbXVzdCBkbyBzbyBleGNsdXNpdmVseSBvbiB5b3VyIGJlaGFsZiwgdW5kZXIgeW91ciBkaXJlY3Rpb24gYW5kCitjb250cm9sLCBvbiB0ZXJtcyB0aGF0IHByb2hpYml0IHRoZW0gZnJvbSBtYWtpbmcgYW55IGNvcGllcyBvZiB5b3VyCitjb3B5cmlnaHRlZCBtYXRlcmlhbCBvdXRzaWRlIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHlvdS4KKworQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIgdGhlCitjb25kaXRpb25zIHN0YXRlZCBiZWxvdy4gU3VibGljZW5zaW5nIGlzIG5vdCBhbGxvd2VkOyBzZWN0aW9uIDEwIG1ha2VzCitpdCB1bm5lY2Vzc2FyeS4KKworIyMjIyAzLiBQcm90ZWN0aW5nIFVzZXJzJyBMZWdhbCBSaWdodHMgRnJvbSBBbnRpLUNpcmN1bXZlbnRpb24gTGF3LgorCitObyBjb3ZlcmVkIHdvcmsgc2hhbGwgYmUgZGVlbWVkIHBhcnQgb2YgYW4gZWZmZWN0aXZlIHRlY2hub2xvZ2ljYWwKK21lYXN1cmUgdW5kZXIgYW55IGFwcGxpY2FibGUgbGF3IGZ1bGZpbGxpbmcgb2JsaWdhdGlvbnMgdW5kZXIgYXJ0aWNsZQorMTEgb2YgdGhlIFdJUE8gY29weXJpZ2h0IHRyZWF0eSBhZG9wdGVkIG9uIDIwIERlY2VtYmVyIDE5OTYsIG9yCitzaW1pbGFyIGxhd3MgcHJvaGliaXRpbmcgb3IgcmVzdHJpY3RpbmcgY2lyY3VtdmVudGlvbiBvZiBzdWNoCittZWFzdXJlcy4KKworV2hlbiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB5b3Ugd2FpdmUgYW55IGxlZ2FsIHBvd2VyIHRvIGZvcmJpZAorY2lyY3VtdmVudGlvbiBvZiB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRvIHRoZSBleHRlbnQgc3VjaAorY2lyY3VtdmVudGlvbiBpcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aAorcmVzcGVjdCB0byB0aGUgY292ZXJlZCB3b3JrLCBhbmQgeW91IGRpc2NsYWltIGFueSBpbnRlbnRpb24gdG8gbGltaXQKK29wZXJhdGlvbiBvciBtb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgYXMgYSBtZWFucyBvZiBlbmZvcmNpbmcsIGFnYWluc3QKK3RoZSB3b3JrJ3MgdXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZAorY2lyY3VtdmVudGlvbiBvZiB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzLgorCisjIyMjIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuCisKK1lvdSBtYXkgY29udmV5IHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzIHlvdQorcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQKK2FwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZTsKK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGlzIExpY2Vuc2UgYW5kIGFueQorbm9uLXBlcm1pc3NpdmUgdGVybXMgYWRkZWQgaW4gYWNjb3JkIHdpdGggc2VjdGlvbiA3IGFwcGx5IHRvIHRoZSBjb2RlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgb2YgdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbGwKK3JlY2lwaWVudHMgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhbnkgcHJpY2Ugb3Igbm8gcHJpY2UgZm9yIGVhY2ggY29weSB0aGF0IHlvdSBjb252ZXksCithbmQgeW91IG1heSBvZmZlciBzdXBwb3J0IG9yIHdhcnJhbnR5IHByb3RlY3Rpb24gZm9yIGEgZmVlLgorCisjIyMjIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCisKK1lvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8KK3Byb2R1Y2UgaXQgZnJvbSB0aGUgUHJvZ3JhbSwgaW4gdGhlIGZvcm0gb2Ygc291cmNlIGNvZGUgdW5kZXIgdGhlCit0ZXJtcyBvZiBzZWN0aW9uIDQsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UKK2NvbmRpdGlvbnM6CisKKy0gICBhKSBUaGUgd29yayBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgbW9kaWZpZWQKKyAgICBpdCwgYW5kIGdpdmluZyBhIHJlbGV2YW50IGRhdGUuCistICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKKyAgICByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBjb25kaXRpb25zIGFkZGVkIHVuZGVyCisgICAgc2VjdGlvbiA3LiBUaGlzIHJlcXVpcmVtZW50IG1vZGlmaWVzIHRoZSByZXF1aXJlbWVudCBpbiBzZWN0aW9uIDQKKyAgICB0byAia2VlcCBpbnRhY3QgYWxsIG5vdGljZXMiLgorLSAgIGMpIFlvdSBtdXN0IGxpY2Vuc2UgdGhlIGVudGlyZSB3b3JrLCBhcyBhIHdob2xlLCB1bmRlciB0aGlzCisgICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuIFRoaXMKKyAgICBMaWNlbnNlIHdpbGwgdGhlcmVmb3JlIGFwcGx5LCBhbG9uZyB3aXRoIGFueSBhcHBsaWNhYmxlIHNlY3Rpb24gNworICAgIGFkZGl0aW9uYWwgdGVybXMsIHRvIHRoZSB3aG9sZSBvZiB0aGUgd29yaywgYW5kIGFsbCBpdHMgcGFydHMsCisgICAgcmVnYXJkbGVzcyBvZiBob3cgdGhleSBhcmUgcGFja2FnZWQuIFRoaXMgTGljZW5zZSBnaXZlcyBubworICAgIHBlcm1pc3Npb24gdG8gbGljZW5zZSB0aGUgd29yayBpbiBhbnkgb3RoZXIgd2F5LCBidXQgaXQgZG9lcyBub3QKKyAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0LgorLSAgIGQpIElmIHRoZSB3b3JrIGhhcyBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZXMsIGVhY2ggbXVzdCBkaXNwbGF5CisgICAgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlczsgaG93ZXZlciwgaWYgdGhlIFByb2dyYW0gaGFzIGludGVyYWN0aXZlCisgICAgaW50ZXJmYWNlcyB0aGF0IGRvIG5vdCBkaXNwbGF5IEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMsIHlvdXIKKyAgICB3b3JrIG5lZWQgbm90IG1ha2UgdGhlbSBkbyBzby4KKworQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAord29ya3MsIHdoaWNoIGFyZSBub3QgYnkgdGhlaXIgbmF0dXJlIGV4dGVuc2lvbnMgb2YgdGhlIGNvdmVyZWQgd29yaywKK2FuZCB3aGljaCBhcmUgbm90IGNvbWJpbmVkIHdpdGggaXQgc3VjaCBhcyB0byBmb3JtIGEgbGFyZ2VyIHByb2dyYW0sCitpbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCisiYWdncmVnYXRlIiBpZiB0aGUgY29tcGlsYXRpb24gYW5kIGl0cyByZXN1bHRpbmcgY29weXJpZ2h0IGFyZSBub3QKK3VzZWQgdG8gbGltaXQgdGhlIGFjY2VzcyBvciBsZWdhbCByaWdodHMgb2YgdGhlIGNvbXBpbGF0aW9uJ3MgdXNlcnMKK2JleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gSW5jbHVzaW9uIG9mIGEgY292ZXJlZCB3b3JrCitpbiBhbiBhZ2dyZWdhdGUgZG9lcyBub3QgY2F1c2UgdGhpcyBMaWNlbnNlIHRvIGFwcGx5IHRvIHRoZSBvdGhlcgorcGFydHMgb2YgdGhlIGFnZ3JlZ2F0ZS4KKworIyMjIyA2LiBDb252ZXlpbmcgTm9uLVNvdXJjZSBGb3Jtcy4KKworWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK3NlY3Rpb25zIDQgYW5kIDUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gY29udmV5IHRoZSBtYWNoaW5lLXJlYWRhYmxlCitDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCBpbiBvbmUgb2YgdGhlc2UKK3dheXM6CisKKy0gICBhKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0CisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmaXhlZCBvbiBhIGR1cmFibGUgcGh5c2ljYWwgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCistICAgYikgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQorICAgIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycyBhbmQgdmFsaWQgZm9yIGFzCisgICAgbG9uZyBhcyB5b3Ugb2ZmZXIgc3BhcmUgcGFydHMgb3IgY3VzdG9tZXIgc3VwcG9ydCBmb3IgdGhhdCBwcm9kdWN0CisgICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQorICAgIGNvcHkgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhbGwgdGhlIHNvZnR3YXJlIGluIHRoZQorICAgIHByb2R1Y3QgdGhhdCBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgb24gYSBkdXJhYmxlIHBoeXNpY2FsCisgICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubworICAgIG1vcmUgdGhhbiB5b3VyIHJlYXNvbmFibGUgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgdGhpcworICAgIGNvbnZleWluZyBvZiBzb3VyY2UsIG9yICgyKSBhY2Nlc3MgdG8gY29weSB0aGUgQ29ycmVzcG9uZGluZworICAgIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgorLSAgIGMpIENvbnZleSBpbmRpdmlkdWFsIGNvcGllcyBvZiB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlCisgICAgd3JpdHRlbiBvZmZlciB0byBwcm92aWRlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZS4gVGhpcworICAgIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBvY2Nhc2lvbmFsbHkgYW5kIG5vbmNvbW1lcmNpYWxseSwgYW5kCisgICAgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIG9iamVjdCBjb2RlIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkCisgICAgd2l0aCBzdWJzZWN0aW9uIDZiLgorLSAgIGQpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIGZyb20gYSBkZXNpZ25hdGVkCisgICAgcGxhY2UgKGdyYXRpcyBvciBmb3IgYSBjaGFyZ2UpLCBhbmQgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgaW4gdGhlIHNhbWUgd2F5IHRocm91Z2ggdGhlIHNhbWUgcGxhY2UgYXQgbm8KKyAgICBmdXJ0aGVyIGNoYXJnZS4gWW91IG5lZWQgbm90IHJlcXVpcmUgcmVjaXBpZW50cyB0byBjb3B5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiBJZiB0aGUgcGxhY2UgdG8KKyAgICBjb3B5IHRoZSBvYmplY3QgY29kZSBpcyBhIG5ldHdvcmsgc2VydmVyLCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UKKyAgICBtYXkgYmUgb24gYSBkaWZmZXJlbnQgc2VydmVyIChvcGVyYXRlZCBieSB5b3Ugb3IgYSB0aGlyZCBwYXJ0eSkKKyAgICB0aGF0IHN1cHBvcnRzIGVxdWl2YWxlbnQgY29weWluZyBmYWNpbGl0aWVzLCBwcm92aWRlZCB5b3UgbWFpbnRhaW4KKyAgICBjbGVhciBkaXJlY3Rpb25zIG5leHQgdG8gdGhlIG9iamVjdCBjb2RlIHNheWluZyB3aGVyZSB0byBmaW5kIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlLiBSZWdhcmRsZXNzIG9mIHdoYXQgc2VydmVyIGhvc3RzIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlLCB5b3UgcmVtYWluIG9ibGlnYXRlZCB0byBlbnN1cmUgdGhhdCBpdCBpcworICAgIGF2YWlsYWJsZSBmb3IgYXMgbG9uZyBhcyBuZWVkZWQgdG8gc2F0aXNmeSB0aGVzZSByZXF1aXJlbWVudHMuCistICAgZSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uLAorICAgIHByb3ZpZGVkIHlvdSBpbmZvcm0gb3RoZXIgcGVlcnMgd2hlcmUgdGhlIG9iamVjdCBjb2RlIGFuZAorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGFyZSBiZWluZyBvZmZlcmVkIHRvIHRoZSBnZW5lcmFsCisgICAgcHVibGljIGF0IG5vIGNoYXJnZSB1bmRlciBzdWJzZWN0aW9uIDZkLgorCitBIHNlcGFyYWJsZSBwb3J0aW9uIG9mIHRoZSBvYmplY3QgY29kZSwgd2hvc2Ugc291cmNlIGNvZGUgaXMgZXhjbHVkZWQKK2Zyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCitpbmNsdWRlZCBpbiBjb252ZXlpbmcgdGhlIG9iamVjdCBjb2RlIHdvcmsuCisKK0EgIlVzZXIgUHJvZHVjdCIgaXMgZWl0aGVyICgxKSBhICJjb25zdW1lciBwcm9kdWN0Iiwgd2hpY2ggbWVhbnMgYW55Cit0YW5naWJsZSBwZXJzb25hbCBwcm9wZXJ0eSB3aGljaCBpcyBub3JtYWxseSB1c2VkIGZvciBwZXJzb25hbCwKK2ZhbWlseSwgb3IgaG91c2Vob2xkIHB1cnBvc2VzLCBvciAoMikgYW55dGhpbmcgZGVzaWduZWQgb3Igc29sZCBmb3IKK2luY29ycG9yYXRpb24gaW50byBhIGR3ZWxsaW5nLiBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhCitjb25zdW1lciBwcm9kdWN0LCBkb3VidGZ1bCBjYXNlcyBzaGFsbCBiZSByZXNvbHZlZCBpbiBmYXZvciBvZgorY292ZXJhZ2UuIEZvciBhIHBhcnRpY3VsYXIgcHJvZHVjdCByZWNlaXZlZCBieSBhIHBhcnRpY3VsYXIgdXNlciwKKyJub3JtYWxseSB1c2VkIiByZWZlcnMgdG8gYSB0eXBpY2FsIG9yIGNvbW1vbiB1c2Ugb2YgdGhhdCBjbGFzcyBvZgorcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzIG9mIHRoZSBwYXJ0aWN1bGFyIHVzZXIgb3Igb2YgdGhlIHdheQoraW4gd2hpY2ggdGhlIHBhcnRpY3VsYXIgdXNlciBhY3R1YWxseSB1c2VzLCBvciBleHBlY3RzIG9yIGlzIGV4cGVjdGVkCit0byB1c2UsIHRoZSBwcm9kdWN0LiBBIHByb2R1Y3QgaXMgYSBjb25zdW1lciBwcm9kdWN0IHJlZ2FyZGxlc3Mgb2YKK3doZXRoZXIgdGhlIHByb2R1Y3QgaGFzIHN1YnN0YW50aWFsIGNvbW1lcmNpYWwsIGluZHVzdHJpYWwgb3IKK25vbi1jb25zdW1lciB1c2VzLCB1bmxlc3Mgc3VjaCB1c2VzIHJlcHJlc2VudCB0aGUgb25seSBzaWduaWZpY2FudAorbW9kZSBvZiB1c2Ugb2YgdGhlIHByb2R1Y3QuCisKKyJJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24iIGZvciBhIFVzZXIgUHJvZHVjdCBtZWFucyBhbnkgbWV0aG9kcywKK3Byb2NlZHVyZXMsIGF1dGhvcml6YXRpb24ga2V5cywgb3Igb3RoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8KK2luc3RhbGwgYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyCitQcm9kdWN0IGZyb20gYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGl0cyBDb3JyZXNwb25kaW5nIFNvdXJjZS4gVGhlCitpbmZvcm1hdGlvbiBtdXN0IHN1ZmZpY2UgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRpbnVlZCBmdW5jdGlvbmluZyBvZgordGhlIG1vZGlmaWVkIG9iamVjdCBjb2RlIGlzIGluIG5vIGNhc2UgcHJldmVudGVkIG9yIGludGVyZmVyZWQgd2l0aAorc29sZWx5IGJlY2F1c2UgbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUuCisKK0lmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCitzcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiwgYSBVc2VyIFByb2R1Y3QsIGFuZCB0aGUgY29udmV5aW5nIG9jY3VycyBhcworcGFydCBvZiBhIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRoZSByaWdodCBvZiBwb3NzZXNzaW9uIGFuZCB1c2Ugb2YgdGhlCitVc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCitmaXhlZCB0ZXJtIChyZWdhcmRsZXNzIG9mIGhvdyB0aGUgdHJhbnNhY3Rpb24gaXMgY2hhcmFjdGVyaXplZCksIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQgdW5kZXIgdGhpcyBzZWN0aW9uIG11c3QgYmUgYWNjb21wYW5pZWQKK2J5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uIEJ1dCB0aGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5CitpZiBuZWl0aGVyIHlvdSBub3IgYW55IHRoaXJkIHBhcnR5IHJldGFpbnMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbAorbW9kaWZpZWQgb2JqZWN0IGNvZGUgb24gdGhlIFVzZXIgUHJvZHVjdCAoZm9yIGV4YW1wbGUsIHRoZSB3b3JrIGhhcworYmVlbiBpbnN0YWxsZWQgaW4gUk9NKS4KKworVGhlIHJlcXVpcmVtZW50IHRvIHByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgYQorcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvcgordXBkYXRlcyBmb3IgYSB3b3JrIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkIGJ5IHRoZQorcmVjaXBpZW50LCBvciBmb3IgdGhlIFVzZXIgUHJvZHVjdCBpbiB3aGljaCBpdCBoYXMgYmVlbiBtb2RpZmllZCBvcgoraW5zdGFsbGVkLiBBY2Nlc3MgdG8gYSBuZXR3b3JrIG1heSBiZSBkZW5pZWQgd2hlbiB0aGUgbW9kaWZpY2F0aW9uCitpdHNlbGYgbWF0ZXJpYWxseSBhbmQgYWR2ZXJzZWx5IGFmZmVjdHMgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbmV0d29yaworb3IgdmlvbGF0ZXMgdGhlIHJ1bGVzIGFuZCBwcm90b2NvbHMgZm9yIGNvbW11bmljYXRpb24gYWNyb3NzIHRoZQorbmV0d29yay4KKworQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQsIGFuZCBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gcHJvdmlkZWQsCitpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24gbXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IGlzIHB1YmxpY2x5Citkb2N1bWVudGVkIChhbmQgd2l0aCBhbiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbgorc291cmNlIGNvZGUgZm9ybSksIGFuZCBtdXN0IHJlcXVpcmUgbm8gc3BlY2lhbCBwYXNzd29yZCBvciBrZXkgZm9yCit1bnBhY2tpbmcsIHJlYWRpbmcgb3IgY29weWluZy4KKworIyMjIyA3LiBBZGRpdGlvbmFsIFRlcm1zLgorCisiQWRkaXRpb25hbCBwZXJtaXNzaW9ucyIgYXJlIHRlcm1zIHRoYXQgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZSBieSBtYWtpbmcgZXhjZXB0aW9ucyBmcm9tIG9uZSBvciBtb3JlIG9mIGl0cyBjb25kaXRpb25zLgorQWRkaXRpb25hbCBwZXJtaXNzaW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbnRpcmUgUHJvZ3JhbSBzaGFsbAorYmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgTGljZW5zZSwgdG8gdGhlIGV4dGVudAordGhhdCB0aGV5IGFyZSB2YWxpZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gSWYgYWRkaXRpb25hbCBwZXJtaXNzaW9ucworYXBwbHkgb25seSB0byBwYXJ0IG9mIHRoZSBQcm9ncmFtLCB0aGF0IHBhcnQgbWF5IGJlIHVzZWQgc2VwYXJhdGVseQordW5kZXIgdGhvc2UgcGVybWlzc2lvbnMsIGJ1dCB0aGUgZW50aXJlIFByb2dyYW0gcmVtYWlucyBnb3Zlcm5lZCBieQordGhpcyBMaWNlbnNlIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorCitXaGVuIHlvdSBjb252ZXkgYSBjb3B5IG9mIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uCityZW1vdmUgYW55IGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZnJvbSB0aGF0IGNvcHksIG9yIGZyb20gYW55IHBhcnQgb2YKK2l0LiAoQWRkaXRpb25hbCBwZXJtaXNzaW9ucyBtYXkgYmUgd3JpdHRlbiB0byByZXF1aXJlIHRoZWlyIG93bgorcmVtb3ZhbCBpbiBjZXJ0YWluIGNhc2VzIHdoZW4geW91IG1vZGlmeSB0aGUgd29yay4pIFlvdSBtYXkgcGxhY2UKK2FkZGl0aW9uYWwgcGVybWlzc2lvbnMgb24gbWF0ZXJpYWwsIGFkZGVkIGJ5IHlvdSB0byBhIGNvdmVyZWQgd29yaywKK2ZvciB3aGljaCB5b3UgaGF2ZSBvciBjYW4gZ2l2ZSBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgcGVybWlzc2lvbi4KKworTm90d2l0aHN0YW5kaW5nIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLCBmb3IgbWF0ZXJpYWwgeW91CithZGQgdG8gYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgKGlmIGF1dGhvcml6ZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzCitvZiB0aGF0IG1hdGVyaWFsKSBzdXBwbGVtZW50IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugd2l0aCB0ZXJtczoKKworLSAgIGEpIERpc2NsYWltaW5nIHdhcnJhbnR5IG9yIGxpbWl0aW5nIGxpYWJpbGl0eSBkaWZmZXJlbnRseSBmcm9tIHRoZQorICAgIHRlcm1zIG9mIHNlY3Rpb25zIDE1IGFuZCAxNiBvZiB0aGlzIExpY2Vuc2U7IG9yCistICAgYikgUmVxdWlyaW5nIHByZXNlcnZhdGlvbiBvZiBzcGVjaWZpZWQgcmVhc29uYWJsZSBsZWdhbCBub3RpY2VzIG9yCisgICAgYXV0aG9yIGF0dHJpYnV0aW9ucyBpbiB0aGF0IG1hdGVyaWFsIG9yIGluIHRoZSBBcHByb3ByaWF0ZSBMZWdhbAorICAgIE5vdGljZXMgZGlzcGxheWVkIGJ5IHdvcmtzIGNvbnRhaW5pbmcgaXQ7IG9yCistICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLAorICAgIG9yIHJlcXVpcmluZyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggbWF0ZXJpYWwgYmUgbWFya2VkIGluCisgICAgcmVhc29uYWJsZSB3YXlzIGFzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uOyBvcgorLSAgIGQpIExpbWl0aW5nIHRoZSB1c2UgZm9yIHB1YmxpY2l0eSBwdXJwb3NlcyBvZiBuYW1lcyBvZiBsaWNlbnNvcnMKKyAgICBvciBhdXRob3JzIG9mIHRoZSBtYXRlcmlhbDsgb3IKKy0gICBlKSBEZWNsaW5pbmcgdG8gZ3JhbnQgcmlnaHRzIHVuZGVyIHRyYWRlbWFyayBsYXcgZm9yIHVzZSBvZiBzb21lCisgICAgdHJhZGUgbmFtZXMsIHRyYWRlbWFya3MsIG9yIHNlcnZpY2UgbWFya3M7IG9yCistICAgZikgUmVxdWlyaW5nIGluZGVtbmlmaWNhdGlvbiBvZiBsaWNlbnNvcnMgYW5kIGF1dGhvcnMgb2YgdGhhdAorICAgIG1hdGVyaWFsIGJ5IGFueW9uZSB3aG8gY29udmV5cyB0aGUgbWF0ZXJpYWwgKG9yIG1vZGlmaWVkIHZlcnNpb25zCisgICAgb2YgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsCisgICAgZm9yIGFueSBsaWFiaWxpdHkgdGhhdCB0aGVzZSBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBkaXJlY3RseQorICAgIGltcG9zZSBvbiB0aG9zZSBsaWNlbnNvcnMgYW5kIGF1dGhvcnMuCisKK0FsbCBvdGhlciBub24tcGVybWlzc2l2ZSBhZGRpdGlvbmFsIHRlcm1zIGFyZSBjb25zaWRlcmVkICJmdXJ0aGVyCityZXN0cmljdGlvbnMiIHdpdGhpbiB0aGUgbWVhbmluZyBvZiBzZWN0aW9uIDEwLiBJZiB0aGUgUHJvZ3JhbSBhcyB5b3UKK3JlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCitnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCBhIHRlcm0gdGhhdCBpcyBhIGZ1cnRoZXIKK3Jlc3RyaWN0aW9uLCB5b3UgbWF5IHJlbW92ZSB0aGF0IHRlcm0uIElmIGEgbGljZW5zZSBkb2N1bWVudCBjb250YWlucworYSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGJ1dCBwZXJtaXRzIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZyB1bmRlciB0aGlzCitMaWNlbnNlLCB5b3UgbWF5IGFkZCB0byBhIGNvdmVyZWQgd29yayBtYXRlcmlhbCBnb3Zlcm5lZCBieSB0aGUgdGVybXMKK29mIHRoYXQgbGljZW5zZSBkb2N1bWVudCwgcHJvdmlkZWQgdGhhdCB0aGUgZnVydGhlciByZXN0cmljdGlvbiBkb2VzCitub3Qgc3Vydml2ZSBzdWNoIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZy4KKworSWYgeW91IGFkZCB0ZXJtcyB0byBhIGNvdmVyZWQgd29yayBpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24sIHlvdQorbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCithZGRpdGlvbmFsIHRlcm1zIHRoYXQgYXBwbHkgdG8gdGhvc2UgZmlsZXMsIG9yIGEgbm90aWNlIGluZGljYXRpbmcKK3doZXJlIHRvIGZpbmQgdGhlIGFwcGxpY2FibGUgdGVybXMuCisKK0FkZGl0aW9uYWwgdGVybXMsIHBlcm1pc3NpdmUgb3Igbm9uLXBlcm1pc3NpdmUsIG1heSBiZSBzdGF0ZWQgaW4gdGhlCitmb3JtIG9mIGEgc2VwYXJhdGVseSB3cml0dGVuIGxpY2Vuc2UsIG9yIHN0YXRlZCBhcyBleGNlcHRpb25zOyB0aGUKK2Fib3ZlIHJlcXVpcmVtZW50cyBhcHBseSBlaXRoZXIgd2F5LgorCisjIyMjIDguIFRlcm1pbmF0aW9uLgorCitZb3UgbWF5IG5vdCBwcm9wYWdhdGUgb3IgbW9kaWZ5IGEgY292ZXJlZCB3b3JrIGV4Y2VwdCBhcyBleHByZXNzbHkKK3Byb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIHByb3BhZ2F0ZSBvcgorbW9kaWZ5IGl0IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyCit0aGlzIExpY2Vuc2UgKGluY2x1ZGluZyBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgdW5kZXIgdGhlIHRoaXJkCitwYXJhZ3JhcGggb2Ygc2VjdGlvbiAxMSkuCisKK0hvd2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5b3VyIGxpY2Vuc2UKK2Zyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMgcmVpbnN0YXRlZCAoYSkgcHJvdmlzaW9uYWxseSwKK3VubGVzcyBhbmQgdW50aWwgdGhlIGNvcHlyaWdodCBob2xkZXIgZXhwbGljaXRseSBhbmQgZmluYWxseQordGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAoYikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQgaG9sZGVyCitmYWlscyB0byBub3RpZnkgeW91IG9mIHRoZSB2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zIHByaW9yIHRvCis2MCBkYXlzIGFmdGVyIHRoZSBjZXNzYXRpb24uCisKK01vcmVvdmVyLCB5b3VyIGxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcworcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlCit2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlCityZWNlaXZlZCBub3RpY2Ugb2YgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSAoZm9yIGFueSB3b3JrKSBmcm9tIHRoYXQKK2NvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKK3lvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgorCitUZXJtaW5hdGlvbiBvZiB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIHNlY3Rpb24gZG9lcyBub3QgdGVybWluYXRlIHRoZQorbGljZW5zZXMgb2YgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMgb3IgcmlnaHRzIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2UuIElmIHlvdXIgcmlnaHRzIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGFuZCBub3QgcGVybWFuZW50bHkKK3JlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUKK21hdGVyaWFsIHVuZGVyIHNlY3Rpb24gMTAuCisKKyMjIyMgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuCisKK1lvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UgaW4gb3JkZXIgdG8gcmVjZWl2ZSBvciBydW4KK2EgY29weSBvZiB0aGUgUHJvZ3JhbS4gQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrCitvY2N1cnJpbmcgc29sZWx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbgordG8gcmVjZWl2ZSBhIGNvcHkgbGlrZXdpc2UgZG9lcyBub3QgcmVxdWlyZSBhY2NlcHRhbmNlLiBIb3dldmVyLAorbm90aGluZyBvdGhlciB0aGFuIHRoaXMgTGljZW5zZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgYW55IGNvdmVyZWQgd29yay4gVGhlc2UgYWN0aW9ucyBpbmZyaW5nZSBjb3B5cmlnaHQgaWYgeW91IGRvCitub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgcHJvcGFnYXRpbmcgYQorY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4KKworIyMjIyAxMC4gQXV0b21hdGljIExpY2Vuc2luZyBvZiBEb3duc3RyZWFtIFJlY2lwaWVudHMuCisKK0VhY2ggdGltZSB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkKK3JlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvcnMsIHRvIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoYXQgd29yaywgc3ViamVjdCB0byB0aGlzIExpY2Vuc2UuIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCitmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoIHRoaXMgTGljZW5zZS4KKworQW4gImVudGl0eSB0cmFuc2FjdGlvbiIgaXMgYSB0cmFuc2FjdGlvbiB0cmFuc2ZlcnJpbmcgY29udHJvbCBvZiBhbgorb3JnYW5pemF0aW9uLCBvciBzdWJzdGFudGlhbGx5IGFsbCBhc3NldHMgb2Ygb25lLCBvciBzdWJkaXZpZGluZyBhbgorb3JnYW5pemF0aW9uLCBvciBtZXJnaW5nIG9yZ2FuaXphdGlvbnMuIElmIHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZAord29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQKK3RyYW5zYWN0aW9uIHdobyByZWNlaXZlcyBhIGNvcHkgb2YgdGhlIHdvcmsgYWxzbyByZWNlaXZlcyB3aGF0ZXZlcgorbGljZW5zZXMgdG8gdGhlIHdvcmsgdGhlIHBhcnR5J3MgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QgaGFkIG9yIGNvdWxkCitnaXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgZnJvbSB0aGUgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QsIGlmCit0aGUgcHJlZGVjZXNzb3IgaGFzIGl0IG9yIGNhbiBnZXQgaXQgd2l0aCByZWFzb25hYmxlIGVmZm9ydHMuCisKK1lvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIGV4ZXJjaXNlIG9mIHRoZQorcmlnaHRzIGdyYW50ZWQgb3IgYWZmaXJtZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiBGb3IgZXhhbXBsZSwgeW91IG1heQorbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mCityaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCB5b3UgbWF5IG5vdCBpbml0aWF0ZSBsaXRpZ2F0aW9uCisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yCitzYWxlLCBvciBpbXBvcnRpbmcgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQuCisKKyMjIyMgMTEuIFBhdGVudHMuCisKK0EgImNvbnRyaWJ1dG9yIiBpcyBhIGNvcHlyaWdodCBob2xkZXIgd2hvIGF1dGhvcml6ZXMgdXNlIHVuZGVyIHRoaXMKK0xpY2Vuc2Ugb2YgdGhlIFByb2dyYW0gb3IgYSB3b3JrIG9uIHdoaWNoIHRoZSBQcm9ncmFtIGlzIGJhc2VkLiBUaGUKK3dvcmsgdGh1cyBsaWNlbnNlZCBpcyBjYWxsZWQgdGhlIGNvbnRyaWJ1dG9yJ3MgImNvbnRyaWJ1dG9yIHZlcnNpb24iLgorCitBIGNvbnRyaWJ1dG9yJ3MgImVzc2VudGlhbCBwYXRlbnQgY2xhaW1zIiBhcmUgYWxsIHBhdGVudCBjbGFpbXMgb3duZWQKK29yIGNvbnRyb2xsZWQgYnkgdGhlIGNvbnRyaWJ1dG9yLCB3aGV0aGVyIGFscmVhZHkgYWNxdWlyZWQgb3IKK2hlcmVhZnRlciBhY3F1aXJlZCwgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgYnkgc29tZSBtYW5uZXIsIHBlcm1pdHRlZAorYnkgdGhpcyBMaWNlbnNlLCBvZiBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLAorYnV0IGRvIG5vdCBpbmNsdWRlIGNsYWltcyB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBvbmx5IGFzIGEKK2NvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250cmlidXRvciB2ZXJzaW9uLiBGb3IKK3B1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudAorcGF0ZW50IHN1YmxpY2Vuc2VzIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mCit0aGlzIExpY2Vuc2UuCisKK0VhY2ggY29udHJpYnV0b3IgZ3JhbnRzIHlvdSBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciB0aGUgY29udHJpYnV0b3IncyBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcywgdG8KK21ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoZSBjb250ZW50cyBvZiBpdHMgY29udHJpYnV0b3IgdmVyc2lvbi4KKworSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBwYXJhZ3JhcGhzLCBhICJwYXRlbnQgbGljZW5zZSIgaXMgYW55IGV4cHJlc3MKK2FncmVlbWVudCBvciBjb21taXRtZW50LCBob3dldmVyIGRlbm9taW5hdGVkLCBub3QgdG8gZW5mb3JjZSBhIHBhdGVudAorKHN1Y2ggYXMgYW4gZXhwcmVzcyBwZXJtaXNzaW9uIHRvIHByYWN0aWNlIGEgcGF0ZW50IG9yIGNvdmVuYW50IG5vdCB0bworc3VlIGZvciBwYXRlbnQgaW5mcmluZ2VtZW50KS4gVG8gImdyYW50IiBzdWNoIGEgcGF0ZW50IGxpY2Vuc2UgdG8gYQorcGFydHkgbWVhbnMgdG8gbWFrZSBzdWNoIGFuIGFncmVlbWVudCBvciBjb21taXRtZW50IG5vdCB0byBlbmZvcmNlIGEKK3BhdGVudCBhZ2FpbnN0IHRoZSBwYXJ0eS4KKworSWYgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywga25vd2luZ2x5IHJlbHlpbmcgb24gYSBwYXRlbnQgbGljZW5zZSwKK2FuZCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgaXMgbm90IGF2YWlsYWJsZSBmb3IgYW55b25lCit0byBjb3B5LCBmcmVlIG9mIGNoYXJnZSBhbmQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgdGhyb3VnaCBhCitwdWJsaWNseSBhdmFpbGFibGUgbmV0d29yayBzZXJ2ZXIgb3Igb3RoZXIgcmVhZGlseSBhY2Nlc3NpYmxlIG1lYW5zLAordGhlbiB5b3UgbXVzdCBlaXRoZXIgKDEpIGNhdXNlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB0byBiZSBzbworYXZhaWxhYmxlLCBvciAoMikgYXJyYW5nZSB0byBkZXByaXZlIHlvdXJzZWxmIG9mIHRoZSBiZW5lZml0IG9mIHRoZQorcGF0ZW50IGxpY2Vuc2UgZm9yIHRoaXMgcGFydGljdWxhciB3b3JrLCBvciAoMykgYXJyYW5nZSwgaW4gYSBtYW5uZXIKK2NvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSwgdG8gZXh0ZW5kIHRoZSBwYXRlbnQKK2xpY2Vuc2UgdG8gZG93bnN0cmVhbSByZWNpcGllbnRzLiAiS25vd2luZ2x5IHJlbHlpbmciIG1lYW5zIHlvdSBoYXZlCithY3R1YWwga25vd2xlZGdlIHRoYXQsIGJ1dCBmb3IgdGhlIHBhdGVudCBsaWNlbnNlLCB5b3VyIGNvbnZleWluZyB0aGUKK2NvdmVyZWQgd29yayBpbiBhIGNvdW50cnksIG9yIHlvdXIgcmVjaXBpZW50J3MgdXNlIG9mIHRoZSBjb3ZlcmVkIHdvcmsKK2luIGEgY291bnRyeSwgd291bGQgaW5mcmluZ2Ugb25lIG9yIG1vcmUgaWRlbnRpZmlhYmxlIHBhdGVudHMgaW4gdGhhdAorY291bnRyeSB0aGF0IHlvdSBoYXZlIHJlYXNvbiB0byBiZWxpZXZlIGFyZSB2YWxpZC4KKworSWYsIHB1cnN1YW50IHRvIG9yIGluIGNvbm5lY3Rpb24gd2l0aCBhIHNpbmdsZSB0cmFuc2FjdGlvbiBvcgorYXJyYW5nZW1lbnQsIHlvdSBjb252ZXksIG9yIHByb3BhZ2F0ZSBieSBwcm9jdXJpbmcgY29udmV5YW5jZSBvZiwgYQorY292ZXJlZCB3b3JrLCBhbmQgZ3JhbnQgYSBwYXRlbnQgbGljZW5zZSB0byBzb21lIG9mIHRoZSBwYXJ0aWVzCityZWNlaXZpbmcgdGhlIGNvdmVyZWQgd29yayBhdXRob3JpemluZyB0aGVtIHRvIHVzZSwgcHJvcGFnYXRlLCBtb2RpZnkKK29yIGNvbnZleSBhIHNwZWNpZmljIGNvcHkgb2YgdGhlIGNvdmVyZWQgd29yaywgdGhlbiB0aGUgcGF0ZW50IGxpY2Vuc2UKK3lvdSBncmFudCBpcyBhdXRvbWF0aWNhbGx5IGV4dGVuZGVkIHRvIGFsbCByZWNpcGllbnRzIG9mIHRoZSBjb3ZlcmVkCit3b3JrIGFuZCB3b3JrcyBiYXNlZCBvbiBpdC4KKworQSBwYXRlbnQgbGljZW5zZSBpcyAiZGlzY3JpbWluYXRvcnkiIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgd2l0aGluIHRoZQorc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcyBjb25kaXRpb25lZCBvbgordGhlIG5vbi1leGVyY2lzZSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgcmlnaHRzIHRoYXQgYXJlIHNwZWNpZmljYWxseQorZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UuIFlvdSBtYXkgbm90IGNvbnZleSBhIGNvdmVyZWQgd29yayBpZiB5b3UKK2FyZSBhIHBhcnR5IHRvIGFuIGFycmFuZ2VtZW50IHdpdGggYSB0aGlyZCBwYXJ0eSB0aGF0IGlzIGluIHRoZQorYnVzaW5lc3Mgb2YgZGlzdHJpYnV0aW5nIHNvZnR3YXJlLCB1bmRlciB3aGljaCB5b3UgbWFrZSBwYXltZW50IHRvIHRoZQordGhpcmQgcGFydHkgYmFzZWQgb24gdGhlIGV4dGVudCBvZiB5b3VyIGFjdGl2aXR5IG9mIGNvbnZleWluZyB0aGUKK3dvcmssIGFuZCB1bmRlciB3aGljaCB0aGUgdGhpcmQgcGFydHkgZ3JhbnRzLCB0byBhbnkgb2YgdGhlIHBhcnRpZXMKK3dobyB3b3VsZCByZWNlaXZlIHRoZSBjb3ZlcmVkIHdvcmsgZnJvbSB5b3UsIGEgZGlzY3JpbWluYXRvcnkgcGF0ZW50CitsaWNlbnNlIChhKSBpbiBjb25uZWN0aW9uIHdpdGggY29waWVzIG9mIHRoZSBjb3ZlcmVkIHdvcmsgY29udmV5ZWQgYnkKK3lvdSAob3IgY29waWVzIG1hZGUgZnJvbSB0aG9zZSBjb3BpZXMpLCBvciAoYikgcHJpbWFyaWx5IGZvciBhbmQgaW4KK2Nvbm5lY3Rpb24gd2l0aCBzcGVjaWZpYyBwcm9kdWN0cyBvciBjb21waWxhdGlvbnMgdGhhdCBjb250YWluIHRoZQorY292ZXJlZCB3b3JrLCB1bmxlc3MgeW91IGVudGVyZWQgaW50byB0aGF0IGFycmFuZ2VtZW50LCBvciB0aGF0IHBhdGVudAorbGljZW5zZSB3YXMgZ3JhbnRlZCwgcHJpb3IgdG8gMjggTWFyY2ggMjAwNy4KKworTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgY29uc3RydWVkIGFzIGV4Y2x1ZGluZyBvciBsaW1pdGluZworYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKK290aGVyd2lzZSBiZSBhdmFpbGFibGUgdG8geW91IHVuZGVyIGFwcGxpY2FibGUgcGF0ZW50IGxhdy4KKworIyMjIyAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KKworSWYgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gSWYgeW91IGNhbm5vdCBjb252ZXkgYQorY292ZXJlZCB3b3JrIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlcgordGhpcyBMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEKK2NvbnNlcXVlbmNlIHlvdSBtYXkgbm90IGNvbnZleSBpdCBhdCBhbGwuIEZvciBleGFtcGxlLCBpZiB5b3UgYWdyZWUgdG8KK3Rlcm1zIHRoYXQgb2JsaWdhdGUgeW91IHRvIGNvbGxlY3QgYSByb3lhbHR5IGZvciBmdXJ0aGVyIGNvbnZleWluZworZnJvbSB0aG9zZSB0byB3aG9tIHlvdSBjb252ZXkgdGhlIFByb2dyYW0sIHRoZSBvbmx5IHdheSB5b3UgY291bGQKK3NhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkKK2Zyb20gY29udmV5aW5nIHRoZSBQcm9ncmFtLgorCisjIyMjIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCitOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIHlvdSBoYXZlCitwZXJtaXNzaW9uIHRvIGxpbmsgb3IgY29tYmluZSBhbnkgY292ZXJlZCB3b3JrIHdpdGggYSB3b3JrIGxpY2Vuc2VkCit1bmRlciB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnRvIGEgc2luZ2xlCitjb21iaW5lZCB3b3JrLCBhbmQgdG8gY29udmV5IHRoZSByZXN1bHRpbmcgd29yay4gVGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLAorYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorc2VjdGlvbiAxMywgY29uY2VybmluZyBpbnRlcmFjdGlvbiB0aHJvdWdoIGEgbmV0d29yayB3aWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gYXMgc3VjaC4KKworIyMjIyAxNC4gUmV2aXNlZCBWZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UuCisKK1RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIFN1Y2ggbmV3IHZlcnNpb25zCit3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluCitkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iIGFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YKK2ZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQgdmVyc2lvbiBvcgorb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIElmIHRoZQorUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uCisKK0lmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUgdmVyc2lvbnMKK29mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdXNlZCwgdGhhdCBwcm94eSdzIHB1YmxpYworc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYSB2ZXJzaW9uIHBlcm1hbmVudGx5IGF1dGhvcml6ZXMgeW91IHRvCitjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KKworTGF0ZXIgbGljZW5zZSB2ZXJzaW9ucyBtYXkgZ2l2ZSB5b3UgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQKK3Blcm1pc3Npb25zLiBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQorYXV0aG9yIG9yIGNvcHlyaWdodCBob2xkZXIgYXMgYSByZXN1bHQgb2YgeW91ciBjaG9vc2luZyB0byBmb2xsb3cgYQorbGF0ZXIgdmVyc2lvbi4KKworIyMjIyAxNS4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4KKworVEhFUkUgSVMgTk8gV0FSUkFOVFkgRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWQorQVBQTElDQUJMRSBMQVcuIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUCitIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUCitXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQKK1BFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUKK0RFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SCitDT1JSRUNUSU9OLgorCisjIyMjIDE2LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4KKworSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUgorQ09OVkVZUyBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCitBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQKK05PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IKK0xPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNCitUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUgorUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisjIyMjIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCisKK0lmIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aWRlZAorYWJvdmUgY2Fubm90IGJlIGdpdmVuIGxvY2FsIGxlZ2FsIGVmZmVjdCBhY2NvcmRpbmcgdG8gdGhlaXIgdGVybXMsCityZXZpZXdpbmcgY291cnRzIHNoYWxsIGFwcGx5IGxvY2FsIGxhdyB0aGF0IG1vc3QgY2xvc2VseSBhcHByb3hpbWF0ZXMKK2FuIGFic29sdXRlIHdhaXZlciBvZiBhbGwgY2l2aWwgbGlhYmlsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKK1Byb2dyYW0sIHVubGVzcyBhIHdhcnJhbnR5IG9yIGFzc3VtcHRpb24gb2YgbGlhYmlsaXR5IGFjY29tcGFuaWVzIGEKK2NvcHkgb2YgdGhlIFByb2dyYW0gaW4gcmV0dXJuIGZvciBhIGZlZS4KKworRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyMjIyBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UKK3Rlcm1zLgorCitUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gSXQgaXMgc2FmZXN0IHRvCithdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5IHN0YXRlCit0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgICAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgICAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlcgorbWFpbC4KKworSWYgdGhlIHByb2dyYW0gZG9lcyB0ZXJtaW5hbCBpbnRlcmFjdGlvbiwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydAorbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgICAgIDxwcm9ncmFtPiAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKyAgICAgICAgVGhpcyBwcm9ncmFtIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICAgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgICAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgXGBzaG93IHcnIGFuZCBcYHNob3cgYycgc2hvdWxkIHNob3cgdGhlCithcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gT2YgY291cnNlLCB5b3VyCitwcm9ncmFtJ3MgY29tbWFuZHMgbWlnaHQgYmUgZGlmZmVyZW50OyBmb3IgYSBHVUkgaW50ZXJmYWNlLCB5b3Ugd291bGQKK3VzZSBhbiAiYWJvdXQgYm94Ii4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLCBhbmQgaG93IHRvIGFwcGx5IGFuZCBmb2xsb3cKK3RoZSBHTlUgR1BMLCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIKK3Byb2dyYW0gaW50byBwcm9wcmlldGFyeSBwcm9ncmFtcy4gSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZQorbGlicmFyeSwgeW91IG1heSBjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeQorYXBwbGljYXRpb25zIHdpdGggdGhlIGxpYnJhcnkuIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZQorR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLiBCdXQgZmlyc3QsCitwbGVhc2UgcmVhZCA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy93aHktbm90LWxncGwuaHRtbD4uCmRpZmYgLS1naXQgYS9QU3luYy5wYy5pbiBiL1BTeW5jLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGM3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9QU3luYy5wYy5pbgpAQCAtMCwwICsxLDEwIEBACitwcmVmaXg9QFBSRUZJWEAKK2xpYmRpcj1ATElCRElSQAoraW5jbHVkZWRpcj1ASU5DTFVERURJUkAKKworTmFtZTogUFN5bmMKK0Rlc2NyaXB0aW9uOiBQU3luYyBsaWJyYXJ5CitWZXJzaW9uOiBAVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sUFN5bmMgLWxuZG4tY3h4CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorCmRpZmYgLS1naXQgYS9SRUFETUUubWQgYi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlODc5MAotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS5tZApAQCAtMCwwICsxLDQ3IEBACitQU1lOQyAtIFBhcnRpYWwgYW5kIEZ1bGwgU3luY2hyb25pemF0aW9uIExpYnJhcnkgZm9yIE5ETgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSWYgeW91IGFyZSBuZXcgdG8gdGhlIE5ETiBjb21tdW5pdHkgb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LCByZWFkIHRoZQorW0NvbnRyaWJ1dG9yJ3MgR3VpZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9uYW1lZC1kYXRhL05GRC9ibG9iL21hc3Rlci9DT05UUklCVVRJTkcubWQpLgorCitQU3luYyBsaWJyYXJ5IGltcGxlbWVudHMgdGhlIFtQU3luYyBwcm90b2NvbF0oaHR0cHM6Ly9uYW1lZC1kYXRhLm5ldC93cC1jb250ZW50L3VwbG9hZHMvMjAxNy8wNS9zY2FsYWJsZV9uYW1lLWJhc2VkX2RhdGFfc3luY2hyb25pemF0aW9uLnBkZikuIEl0IHVzZXMgSW52ZXJ0aWJsZQorQmxvb20gTG9va3VwIFRhYmxlIChJQkxUKSwgYWxzbyBrbm93biBhcyBJbnZlcnRpYmxlIEJsb29tIEZpbHRlciAoSUJGKSwgdG8gcmVwcmVzZW50IHRoZSBzdGF0ZQorb2YgYSBwcm9kdWNlciBpbiBwYXJ0aWFsIHN5bmMgbW9kZSBhbmQgdGhlIHN0YXRlIG9mIGEgbm9kZSBpbiBmdWxsIHN5bmMgbW9kZS4gQW4gSUJGIGlzIGEgY29tcGFjdCBkYXRhCitzdHJ1Y3R1cmUgd2hlcmUgZGlmZmVyZW5jZSBvZiB0d28gSUJGcyBjYW4gYmUgY29tcHV0ZWQgZWZmaWNpZW50bHkuCitJbiBwYXJ0aWFsIHN5bmMsIFBTeW5jIHVzZXMgYSBCbG9vbSBGaWx0ZXIgdG8gcmVwcmVzZW50IHRoZSBzdWJzY3JpcHRpb24gb2YgbGlzdCBvZiB0aGUgY29uc3VtZXIuCitQU3luYyB1c2VzIFtuZG4tY3h4XShodHRwczovL2dpdGh1Yi5jb20vbmFtZWQtZGF0YS9uZG4tY3h4KSBsaWJyYXJ5IGFzIE5ETiBkZXZlbG9wbWVudAorbGlicmFyeS4KKworUFN5bmMgaXMgYW4gb3BlbiBzb3VyY2UgcHJvamVjdCBsaWNlbnNlZCB1bmRlciBHUEwgMy4wIChzZWUgYENPUFlJTkcubWRgIGZvciBtb3JlCitkZXRhaWwpLiAgV2UgaGlnaGx5IHdlbGNvbWUgYWxsIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIFBTeW5jIGNvZGUgYmFzZSwgcHJvdmlkZWQgdGhhdAordGhleSBjYW4gbGljZW5zZWQgdW5kZXIgR1BMIDMuMCsgb3Igb3RoZXIgY29tcGF0aWJsZSBsaWNlbnNlLgorCitGZWVkYmFjaworLS0tLS0tLS0KKworUGxlYXNlIHN1Ym1pdCBhbnkgYnVncyBvciBpc3N1ZXMgdG8gdGhlICoqUFN5bmMqKiBpc3N1ZSB0cmFja2VyOgorCisqIGh0dHBzOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9wc3luYworCitJbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjIyBQcmVyZXF1aXNpdGVzCisKK1JlcXVpcmVkOgorCisqIFtuZG4tY3h4IGFuZCBpdHMgZGVwZW5kZW5jaWVzXShodHRwczovL25hbWVkLWRhdGEubmV0L2RvYy9uZG4tY3h4LykKKworIyMjIEJ1aWxkCisKK1RvIGJ1aWxkIFBTeW5jIGZyb20gdGhlIHNvdXJjZToKKworICAgIC4vd2FmIGNvbmZpZ3VyZQorICAgIC4vd2FmCisgICAgc3VkbyAuL3dhZiBpbnN0YWxsCisKK1RvIGJ1aWxkIG9uIG1lbW9yeSBjb25zdHJhaW5lZCBwbGF0Zm9ybSwgcGxlYXNlIHVzZSBgLi93YWYgLWoxYCBpbnN0ZWFkIG9mIGAuL3dhZmAuIFRoZQorY29tbWFuZCB3aWxsIGRpc2FibGUgcGFyYWxsZWwgY29tcGlsYXRpb24uCisKK0lmIGNvbmZpZ3VyZWQgd2l0aCB0ZXN0czogYC4vd2FmIGNvbmZpZ3VyZSAtLXdpdGgtdGVzdHNgKSwgdGhlIGFib3ZlIGNvbW1hbmRzIHdpbGwgYWxzbworZ2VuZXJhdGUgdW5pdCB0ZXN0cyBpbiBgLi9idWlsZC91bml0LXRlc3RzYApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvY29uZi5weSBiL2RvY3MvY29uZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdiZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9jb25mLnB5CkBAIC0wLDAgKzEsMjU5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIyBQU3luYyAtIE5hbWVkIERhdGEgTmV0d29ya2luZyBGb3J3YXJkaW5nIERhZW1vbiBkb2N1bWVudGF0aW9uIGJ1aWxkIGNvbmZpZ3VyYXRpb24gZmlsZSwgY3JlYXRlZCBieQorIyBzcGhpbngtcXVpY2tzdGFydCBvbiBTdW4gQXByICA2IDE5OjU4OjIyIDIwMTQuCisjCisjIFRoaXMgZmlsZSBpcyBleGVjZmlsZSgpZCB3aXRoIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBzZXQgdG8gaXRzCisjIGNvbnRhaW5pbmcgZGlyLgorIworIyBOb3RlIHRoYXQgbm90IGFsbCBwb3NzaWJsZSBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmUgcHJlc2VudCBpbiB0aGlzCisjIGF1dG9nZW5lcmF0ZWQgZmlsZS4KKyMKKyMgQWxsIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGhhdmUgYSBkZWZhdWx0OyB2YWx1ZXMgdGhhdCBhcmUgY29tbWVudGVkIG91dAorIyBzZXJ2ZSB0byBzaG93IHRoZSBkZWZhdWx0LgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IGRhdGV0aW1lCisKKyMgSWYgZXh0ZW5zaW9ucyAob3IgbW9kdWxlcyB0byBkb2N1bWVudCB3aXRoIGF1dG9kb2MpIGFyZSBpbiBhbm90aGVyIGRpcmVjdG9yeSwKKyMgYWRkIHRoZXNlIGRpcmVjdG9yaWVzIHRvIHN5cy5wYXRoIGhlcmUuIElmIHRoZSBkaXJlY3RvcnkgaXMgcmVsYXRpdmUgdG8gdGhlCisjIGRvY3VtZW50YXRpb24gcm9vdCwgdXNlIG9zLnBhdGguYWJzcGF0aCB0byBtYWtlIGl0IGFic29sdXRlLCBsaWtlIHNob3duIGhlcmUuCisjc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguYWJzcGF0aCgnLicpKQorCisjIC0tIEdlbmVyYWwgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB5b3VyIGRvY3VtZW50YXRpb24gbmVlZHMgYSBtaW5pbWFsIFNwaGlueCB2ZXJzaW9uLCBzdGF0ZSBpdCBoZXJlLgorI25lZWRzX3NwaGlueCA9ICcxLjAnCisKKyMgQWRkIGFueSBTcGhpbnggZXh0ZW5zaW9uIG1vZHVsZSBuYW1lcyBoZXJlLCBhcyBzdHJpbmdzLiBUaGV5IGNhbiBiZQorIyBleHRlbnNpb25zIGNvbWluZyB3aXRoIFNwaGlueCAobmFtZWQgJ3NwaGlueC5leHQuKicpIG9yIHlvdXIgY3VzdG9tCisjIG9uZXMuCitleHRlbnNpb25zID0gWworICAgICdzcGhpbnguZXh0LnRvZG8nLAorXQorCitkZWYgYWRkRXh0ZW5zaW9uSWZFeGlzdHMoZXh0ZW5zaW9uKToKKyAgICB0cnk6CisgICAgICAgIF9faW1wb3J0X18oZXh0ZW5zaW9uKQorICAgICAgICBleHRlbnNpb25zLmFwcGVuZChleHRlbnNpb24pCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJFeHRlbnNpb24gJyVzJyBpbiBub3QgYXZhaWxhYmxlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbWUgZG9jdW1lbnRhdGlvbiBtYXkgbm90IGJ1aWxkIGNvcnJlY3RseS5cbiIgJSBleHRlbnNpb24pCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlRvIGluc3RhbGwsIHVzZSBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICBzdWRvIHBpcCBpbnN0YWxsICVzXG4iICUgZXh0ZW5zaW9uLnJlcGxhY2UoJy4nLCAnLScpKQorCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CisgICAgYWRkRXh0ZW5zaW9uSWZFeGlzdHMoJ3NwaGlueGNvbnRyaWIuZG94eWxpbmsnKQorCisjIHNwaGlueGNvbnRyaWIuZ29vZ2xlYW5hbHl0aWNzIGlzIGN1cnJlbnRseSBub3Qgd29ya2luZyB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBzcGhpbngKKyMgaWYgb3MuZ2V0ZW52KCdHT09HTEVfQU5BTFlUSUNTJywgTm9uZSk6CisjICAgICBhZGRFeHRlbnNpb25JZkV4aXN0cygnc3BoaW54Y29udHJpYi5nb29nbGVhbmFseXRpY3MnKQorCisjIEFkZCBhbnkgcGF0aHMgdGhhdCBjb250YWluIHRlbXBsYXRlcyBoZXJlLCByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS4KK3RlbXBsYXRlc19wYXRoID0gWydfdGVtcGxhdGVzJ10KKworIyBUaGUgc3VmZml4IG9mIHNvdXJjZSBmaWxlbmFtZXMuCitzb3VyY2Vfc3VmZml4ID0gJy5yc3QnCisKKyMgVGhlIGVuY29kaW5nIG9mIHNvdXJjZSBmaWxlcy4KKyNzb3VyY2VfZW5jb2RpbmcgPSAndXRmLTgtc2lnJworCisjIFRoZSBtYXN0ZXIgdG9jdHJlZSBkb2N1bWVudC4KK21hc3Rlcl9kb2MgPSAnaW5kZXgnCisKKyMgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvamVjdC4KK3Byb2plY3QgPSB1J1BTeW5jOiBBIFN5bmNocm9uaXphdGlvbiBQcm90b2NvbCBpbiBORE4nCitjb3B5cmlnaHQgPSB1J3t9LCBOYW1lZCBEYXRhIE5ldHdvcmtpbmcgUHJvamVjdCcuZm9ybWF0KGRhdGV0aW1lLmRhdGUudG9kYXkoKS55ZWFyKQorCisjIFRoZSBsYW5ndWFnZSBmb3IgY29udGVudCBhdXRvZ2VuZXJhdGVkIGJ5IFNwaGlueC4gUmVmZXIgdG8gZG9jdW1lbnRhdGlvbgorIyBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBsYW5ndWFnZXMuCisjbGFuZ3VhZ2UgPSBOb25lCisKKyMgVGhlcmUgYXJlIHR3byBvcHRpb25zIGZvciByZXBsYWNpbmcgfHRvZGF5fDogZWl0aGVyLCB5b3Ugc2V0IHRvZGF5IHRvIHNvbWUKKyMgbm9uLWZhbHNlIHZhbHVlLCB0aGVuIGl0IGlzIHVzZWQ6CisjdG9kYXkgPSAnJworIyBFbHNlLCB0b2RheV9mbXQgaXMgdXNlZCBhcyB0aGUgZm9ybWF0IGZvciBhIHN0cmZ0aW1lIGNhbGwuCisjdG9kYXlfZm10ID0gJyVCICVkLCAlWScKKworIyBMaXN0IG9mIHBhdHRlcm5zLCByZWxhdGl2ZSB0byBzb3VyY2UgZGlyZWN0b3J5LCB0aGF0IG1hdGNoIGZpbGVzIGFuZAorIyBkaXJlY3RvcmllcyB0byBpZ25vcmUgd2hlbiBsb29raW5nIGZvciBzb3VyY2UgZmlsZXMuCitleGNsdWRlX3BhdHRlcm5zID0gW10KKworIyBUaGUgcmVTVCBkZWZhdWx0IHJvbGUgKHVzZWQgZm9yIHRoaXMgbWFya3VwOiBgdGV4dGApIHRvIHVzZSBmb3IgYWxsCisjIGRvY3VtZW50cy4KKyNkZWZhdWx0X3JvbGUgPSBOb25lCisKKyMgSWYgdHJ1ZSwgJygpJyB3aWxsIGJlIGFwcGVuZGVkIHRvIDpmdW5jOiBldGMuIGNyb3NzLXJlZmVyZW5jZSB0ZXh0LgorI2FkZF9mdW5jdGlvbl9wYXJlbnRoZXNlcyA9IFRydWUKKworIyBJZiB0cnVlLCB0aGUgY3VycmVudCBtb2R1bGUgbmFtZSB3aWxsIGJlIHByZXBlbmRlZCB0byBhbGwgZGVzY3JpcHRpb24KKyMgdW5pdCB0aXRsZXMgKHN1Y2ggYXMgLi4gZnVuY3Rpb246OikuCisjYWRkX21vZHVsZV9uYW1lcyA9IFRydWUKKworIyBJZiB0cnVlLCBzZWN0aW9uYXV0aG9yIGFuZCBtb2R1bGVhdXRob3IgZGlyZWN0aXZlcyB3aWxsIGJlIHNob3duIGluIHRoZQorIyBvdXRwdXQuIFRoZXkgYXJlIGlnbm9yZWQgYnkgZGVmYXVsdC4KKyNzaG93X2F1dGhvcnMgPSBGYWxzZQorCisjIFRoZSBuYW1lIG9mIHRoZSBQeWdtZW50cyAoc3ludGF4IGhpZ2hsaWdodGluZykgc3R5bGUgdG8gdXNlLgorcHlnbWVudHNfc3R5bGUgPSAnc3BoaW54JworCisjIEEgbGlzdCBvZiBpZ25vcmVkIHByZWZpeGVzIGZvciBtb2R1bGUgaW5kZXggc29ydGluZy4KKyNtb2RpbmRleF9jb21tb25fcHJlZml4ID0gW10KKworIyBJZiB0cnVlLCBrZWVwIHdhcm5pbmdzIGFzICJzeXN0ZW0gbWVzc2FnZSIgcGFyYWdyYXBocyBpbiB0aGUgYnVpbHQgZG9jdW1lbnRzLgorI2tlZXBfd2FybmluZ3MgPSBGYWxzZQorCisKKyMgLS0gT3B0aW9ucyBmb3IgSFRNTCBvdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSB0aGVtZSB0byB1c2UgZm9yIEhUTUwgYW5kIEhUTUwgSGVscCBwYWdlcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKyMgYSBsaXN0IG9mIGJ1aWx0aW4gdGhlbWVzLgorIyBodG1sX3RoZW1lID0gJ2RlZmF1bHQnCitodG1sX3RoZW1lID0gJ25hbWVkX2RhdGFfdGhlbWUnCisKKyMgVGhlbWUgb3B0aW9ucyBhcmUgdGhlbWUtc3BlY2lmaWMgYW5kIGN1c3RvbWl6ZSB0aGUgbG9vayBhbmQgZmVlbCBvZiBhIHRoZW1lCisjIGZ1cnRoZXIuICBGb3IgYSBsaXN0IG9mIG9wdGlvbnMgYXZhaWxhYmxlIGZvciBlYWNoIHRoZW1lLCBzZWUgdGhlCisjIGRvY3VtZW50YXRpb24uCisjaHRtbF90aGVtZV9vcHRpb25zID0ge30KKworIyBBZGQgYW55IHBhdGhzIHRoYXQgY29udGFpbiBjdXN0b20gdGhlbWVzIGhlcmUsIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5LgoraHRtbF90aGVtZV9wYXRoID0gWycuLyddCisKKyMgVGhlIG5hbWUgZm9yIHRoaXMgc2V0IG9mIFNwaGlueCBkb2N1bWVudHMuICBJZiBOb25lLCBpdCBkZWZhdWx0cyB0bworIyAiPHByb2plY3Q+IHY8cmVsZWFzZT4gZG9jdW1lbnRhdGlvbiIuCisjaHRtbF90aXRsZSA9IE5vbmUKKworIyBBIHNob3J0ZXIgdGl0bGUgZm9yIHRoZSBuYXZpZ2F0aW9uIGJhci4gIERlZmF1bHQgaXMgdGhlIHNhbWUgYXMgaHRtbF90aXRsZS4KKyNodG1sX3Nob3J0X3RpdGxlID0gTm9uZQorCisjIFRoZSBuYW1lIG9mIGFuIGltYWdlIGZpbGUgKHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5KSB0byBwbGFjZSBhdCB0aGUgdG9wCisjIG9mIHRoZSBzaWRlYmFyLgorI2h0bWxfbG9nbyA9IE5vbmUKKworIyBUaGUgbmFtZSBvZiBhbiBpbWFnZSBmaWxlICh3aXRoaW4gdGhlIHN0YXRpYyBwYXRoKSB0byB1c2UgYXMgZmF2aWNvbiBvZiB0aGUKKyMgZG9jcy4gIFRoaXMgZmlsZSBzaG91bGQgYmUgYSBXaW5kb3dzIGljb24gZmlsZSAoLmljbykgYmVpbmcgMTZ4MTYgb3IgMzJ4MzIKKyMgcGl4ZWxzIGxhcmdlLgorI2h0bWxfZmF2aWNvbiA9IE5vbmUKKworIyBBZGQgYW55IHBhdGhzIHRoYXQgY29udGFpbiBjdXN0b20gc3RhdGljIGZpbGVzIChzdWNoIGFzIHN0eWxlIHNoZWV0cykgaGVyZSwKKyMgcmVsYXRpdmUgdG8gdGhpcyBkaXJlY3RvcnkuIFRoZXkgYXJlIGNvcGllZCBhZnRlciB0aGUgYnVpbHRpbiBzdGF0aWMgZmlsZXMsCisjIHNvIGEgZmlsZSBuYW1lZCAiZGVmYXVsdC5jc3MiIHdpbGwgb3ZlcndyaXRlIHRoZSBidWlsdGluICJkZWZhdWx0LmNzcyIuCisjIGh0bWxfc3RhdGljX3BhdGggPSBbJ19zdGF0aWMnXQorCisjIEFkZCBhbnkgZXh0cmEgcGF0aHMgdGhhdCBjb250YWluIGN1c3RvbSBmaWxlcyAoc3VjaCBhcyByb2JvdHMudHh0IG9yCisjIC5odGFjY2VzcykgaGVyZSwgcmVsYXRpdmUgdG8gdGhpcyBkaXJlY3RvcnkuIFRoZXNlIGZpbGVzIGFyZSBjb3BpZWQKKyMgZGlyZWN0bHkgdG8gdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50YXRpb24uCisjaHRtbF9leHRyYV9wYXRoID0gW10KKworIyBJZiBub3QgJycsIGEgJ0xhc3QgdXBkYXRlZCBvbjonIHRpbWVzdGFtcCBpcyBpbnNlcnRlZCBhdCBldmVyeSBwYWdlIGJvdHRvbSwKKyMgdXNpbmcgdGhlIGdpdmVuIHN0cmZ0aW1lIGZvcm1hdC4KKyNodG1sX2xhc3RfdXBkYXRlZF9mbXQgPSAnJWIgJWQsICVZJworCisjIElmIHRydWUsIFNtYXJ0eVBhbnRzIHdpbGwgYmUgdXNlZCB0byBjb252ZXJ0IHF1b3RlcyBhbmQgZGFzaGVzIHRvCisjIHR5cG9ncmFwaGljYWxseSBjb3JyZWN0IGVudGl0aWVzLgorI2h0bWxfdXNlX3NtYXJ0eXBhbnRzID0gVHJ1ZQorCisjIEN1c3RvbSBzaWRlYmFyIHRlbXBsYXRlcywgbWFwcyBkb2N1bWVudCBuYW1lcyB0byB0ZW1wbGF0ZSBuYW1lcy4KKyNodG1sX3NpZGViYXJzID0ge30KKworIyBBZGRpdGlvbmFsIHRlbXBsYXRlcyB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCB0byBwYWdlcywgbWFwcyBwYWdlIG5hbWVzIHRvCisjIHRlbXBsYXRlIG5hbWVzLgorI2h0bWxfYWRkaXRpb25hbF9wYWdlcyA9IHt9CisKKyMgSWYgZmFsc2UsIG5vIG1vZHVsZSBpbmRleCBpcyBnZW5lcmF0ZWQuCisjaHRtbF9kb21haW5faW5kaWNlcyA9IFRydWUKKworIyBJZiBmYWxzZSwgbm8gaW5kZXggaXMgZ2VuZXJhdGVkLgorI2h0bWxfdXNlX2luZGV4ID0gVHJ1ZQorCisjIElmIHRydWUsIHRoZSBpbmRleCBpcyBzcGxpdCBpbnRvIGluZGl2aWR1YWwgcGFnZXMgZm9yIGVhY2ggbGV0dGVyLgorI2h0bWxfc3BsaXRfaW5kZXggPSBGYWxzZQorCisjIElmIHRydWUsIGxpbmtzIHRvIHRoZSByZVNUIHNvdXJjZXMgYXJlIGFkZGVkIHRvIHRoZSBwYWdlcy4KKyNodG1sX3Nob3dfc291cmNlbGluayA9IFRydWUKKworIyBJZiB0cnVlLCAiQ3JlYXRlZCB1c2luZyBTcGhpbngiIGlzIHNob3duIGluIHRoZSBIVE1MIGZvb3Rlci4gRGVmYXVsdCBpcyBUcnVlLgorI2h0bWxfc2hvd19zcGhpbnggPSBUcnVlCisKKyMgSWYgdHJ1ZSwgIihDKSBDb3B5cmlnaHQgLi4uIiBpcyBzaG93biBpbiB0aGUgSFRNTCBmb290ZXIuIERlZmF1bHQgaXMgVHJ1ZS4KKyNodG1sX3Nob3dfY29weXJpZ2h0ID0gVHJ1ZQorCisjIElmIHRydWUsIGFuIE9wZW5TZWFyY2ggZGVzY3JpcHRpb24gZmlsZSB3aWxsIGJlIG91dHB1dCwgYW5kIGFsbCBwYWdlcyB3aWxsCisjIGNvbnRhaW4gYSA8bGluaz4gdGFnIHJlZmVycmluZyB0byBpdC4gIFRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbiBtdXN0IGJlIHRoZQorIyBiYXNlIFVSTCBmcm9tIHdoaWNoIHRoZSBmaW5pc2hlZCBIVE1MIGlzIHNlcnZlZC4KKyNodG1sX3VzZV9vcGVuc2VhcmNoID0gJycKKworIyBUaGlzIGlzIHRoZSBmaWxlIG5hbWUgc3VmZml4IGZvciBIVE1MIGZpbGVzIChlLmcuICIueGh0bWwiKS4KK2h0bWxfZmlsZV9zdWZmaXggPSAiLmh0bWwiCisKKyMgT3V0cHV0IGZpbGUgYmFzZSBuYW1lIGZvciBIVE1MIGhlbHAgYnVpbGRlci4KK2h0bWxoZWxwX2Jhc2VuYW1lID0gJ1BTeW5jLWRvY3MnCisKKworIyAtLSBPcHRpb25zIGZvciBMYVRlWCBvdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2xhdGV4X2VsZW1lbnRzID0geworIyBUaGUgcGFwZXIgc2l6ZSAoJ2xldHRlcnBhcGVyJyBvciAnYTRwYXBlcicpLgorIydwYXBlcnNpemUnOiAnbGV0dGVycGFwZXInLAorCisjIFRoZSBmb250IHNpemUgKCcxMHB0JywgJzExcHQnIG9yICcxMnB0JykuCisjJ3BvaW50c2l6ZSc6ICcxMHB0JywKKworIyBBZGRpdGlvbmFsIHN0dWZmIGZvciB0aGUgTGFUZVggcHJlYW1ibGUuCisjJ3ByZWFtYmxlJzogJycsCit9CisKKyMgR3JvdXBpbmcgdGhlIGRvY3VtZW50IHRyZWUgaW50byBMYVRlWCBmaWxlcy4gTGlzdCBvZiB0dXBsZXMKKyMgKHNvdXJjZSBzdGFydCBmaWxlLCB0YXJnZXQgbmFtZSwgdGl0bGUsCisjICBhdXRob3IsIGRvY3VtZW50Y2xhc3MgW2hvd3RvLCBtYW51YWwsIG9yIG93biBjbGFzc10pLgorbGF0ZXhfZG9jdW1lbnRzID0gWworICAoJ2luZGV4JywgJ1BTeW5jLWRvY3MudGV4JywgdSdGdWxsL1BhcnRpYWwgU3luY2hyb25pemF0aW9uIFByb3RvY29sIGluIE5ETicsCisgICB1J05hbWVkIERhdGEgTmV0d29ya2luZyBQcm9qZWN0JywgJ21hbnVhbCcpLAorXQorCisjIFRoZSBuYW1lIG9mIGFuIGltYWdlIGZpbGUgKHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5KSB0byBwbGFjZSBhdCB0aGUgdG9wIG9mCisjIHRoZSB0aXRsZSBwYWdlLgorI2xhdGV4X2xvZ28gPSBOb25lCisKKyMgRm9yICJtYW51YWwiIGRvY3VtZW50cywgaWYgdGhpcyBpcyB0cnVlLCB0aGVuIHRvcGxldmVsIGhlYWRpbmdzIGFyZSBwYXJ0cywKKyMgbm90IGNoYXB0ZXJzLgorI2xhdGV4X3VzZV9wYXJ0cyA9IEZhbHNlCisKKyMgSWYgdHJ1ZSwgc2hvdyBwYWdlIHJlZmVyZW5jZXMgYWZ0ZXIgaW50ZXJuYWwgbGlua3MuCisjbGF0ZXhfc2hvd19wYWdlcmVmcyA9IEZhbHNlCisKKyMgSWYgdHJ1ZSwgc2hvdyBVUkwgYWRkcmVzc2VzIGFmdGVyIGV4dGVybmFsIGxpbmtzLgorI2xhdGV4X3Nob3dfdXJscyA9IEZhbHNlCisKKyMgRG9jdW1lbnRzIHRvIGFwcGVuZCBhcyBhbiBhcHBlbmRpeCB0byBhbGwgbWFudWFscy4KKyNsYXRleF9hcHBlbmRpY2VzID0gW10KKworIyBJZiBmYWxzZSwgbm8gbW9kdWxlIGluZGV4IGlzIGdlbmVyYXRlZC4KKyNsYXRleF9kb21haW5faW5kaWNlcyA9IFRydWUKKworCisjIC0tIE9wdGlvbnMgZm9yIG1hbnVhbCBwYWdlIG91dHB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBPbmUgZW50cnkgcGVyIG1hbnVhbCBwYWdlLiBMaXN0IG9mIHR1cGxlcworIyAoc291cmNlIHN0YXJ0IGZpbGUsIG5hbWUsIGRlc2NyaXB0aW9uLCBhdXRob3JzLCBtYW51YWwgc2VjdGlvbikuCittYW5fcGFnZXMgPSBbCitdCisKKworIyBJZiB0cnVlLCBzaG93IFVSTCBhZGRyZXNzZXMgYWZ0ZXIgZXh0ZXJuYWwgbGlua3MuCittYW5fc2hvd191cmxzID0gVHJ1ZQorCisKKyMgLS0tLSBDdXN0b20gb3B0aW9ucyAtLS0tLS0tLQorCitkb3h5bGluayA9IHsKKyAgJ1BTeW5jJyA6ICgnUFN5bmMudGFnJywgJ2RveHlnZW4vJyksCit9CisKK2lmIG9zLmdldGVudignR09PR0xFX0FOQUxZVElDUycsIE5vbmUpOgorICAgIGdvb2dsZWFuYWx5dGljc19pZCA9IG9zLmVudmlyb25bJ0dPT0dMRV9BTkFMWVRJQ1MnXQorICAgIGdvb2dsZWFuYWx5dGljc19lbmFibGVkID0gVHJ1ZQorCitleGNsdWRlX3BhdHRlcm5zID0gWydSRUxFQVNFX05PVEVTLnJzdCddCmRpZmYgLS1naXQgYS9kb2NzL2RveHlnZW4uY29uZi5pbiBiL2RvY3MvZG94eWdlbi5jb25mLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDUzZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2RveHlnZW4uY29uZi5pbgpAQCAtMCwwICsxLDI0NDYgQEAKKyMgRG94eWZpbGUgMS44LjEzCisKKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0LgorIworIyBBbGwgdGV4dCBhZnRlciBhIGRvdWJsZSBoYXNoICgjIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIGlzIHBsYWNlZCBpbgorIyBmcm9udCBvZiB0aGUgVEFHIGl0IGlzIHByZWNlZGluZy4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBzaW5nbGUgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4KKyMgVGhlIGZvcm1hdCBpczoKKyMgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIEZvciBsaXN0cywgaXRlbXMgY2FuIGFsc28gYmUgYXBwZW5kZWQgdXNpbmc6CisjIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgVmFsdWVzIHRoYXQgY29udGFpbiBzcGFjZXMgc2hvdWxkIGJlIHBsYWNlZCBiZXR3ZWVuIHF1b3RlcyAoXCIgXCIpLgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2plY3QgcmVsYXRlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBjb25maWcgZmlsZQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIHRleHQKKyMgYmVmb3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoaXMgdGFnLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udgorIyBidWlsdCBpbnRvIGxpYmMpIGZvciB0aGUgdHJhbnNjb2RpbmcuIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYKKyMgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgorCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgKKworIyBUaGUgUFJPSkVDVF9OQU1FIHRhZyBpcyBhIHNpbmdsZSB3b3JkIChvciBhIHNlcXVlbmNlIG9mIHdvcmRzIHN1cnJvdW5kZWQgYnkKKyMgZG91YmxlLXF1b3RlcywgdW5sZXNzIHlvdSBhcmUgdXNpbmcgRG94eXdpemFyZCkgdGhhdCBzaG91bGQgaWRlbnRpZnkgdGhlCisjIHByb2plY3QgZm9yIHdoaWNoIHRoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBuYW1lIGlzIHVzZWQgaW4gdGhlCisjIHRpdGxlIG9mIG1vc3QgZ2VuZXJhdGVkIHBhZ2VzIGFuZCBpbiBhIGZldyBvdGhlciBwbGFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBNeSBQcm9qZWN0LgorCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gIlBTeW5jIgorCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4gVGhpcworIyBjb3VsZCBiZSBoYW5keSBmb3IgYXJjaGl2aW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBvciBpZiBzb21lIHZlcnNpb24KKyMgY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4KKworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IEBWRVJTSU9OQAorCisjIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlciBhCisjIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0LgorCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0KKworIyBXaXRoIHRoZSBQUk9KRUNUX0xPR08gdGFnIG9uZSBjYW4gc3BlY2lmeSBhIGxvZ28gb3IgYW4gaWNvbiB0aGF0IGlzIGluY2x1ZGVkCisjIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGxvZ28gc2hvdWxkIG5vdCBleGNlZWQgNTUKKyMgcGl4ZWxzIGFuZCB0aGUgbWF4aW11bSB3aWR0aCBzaG91bGQgbm90IGV4Y2VlZCAyMDAgcGl4ZWxzLiBEb3h5Z2VuIHdpbGwgY29weQorIyB0aGUgbG9nbyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKworUFJPSkVDVF9MT0dPICAgICAgICAgICA9CisKKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKSBwYXRoCisjIGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgd3JpdHRlbi4gSWYgYSByZWxhdGl2ZSBwYXRoIGlzCisjIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmCisjIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IGRvY3MvZG94eWdlbgorCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCisjIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAorIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCisjIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQorIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKKyMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEFMTE9XX1VOSUNPREVfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhbGxvdyBub24tQVNDSUkKKyMgY2hhcmFjdGVycyB0byBhcHBlYXIgaW4gdGhlIG5hbWVzIG9mIGdlbmVyYXRlZCBmaWxlcy4gSWYgc2V0IHRvIE5PLCBub24tQVNDSUkKKyMgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQsIGZvciBleGFtcGxlIF94RTNfeDgxX3g4NCB3aWxsIGJlIHVzZWQgZm9yIFVuaWNvZGUKKyMgVSszMDQ0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0FMTE9XX1VOSUNPREVfTkFNRVMgICAgPSBOTworCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsCisjIGRvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaXMgd3JpdHRlbi4gRG94eWdlbiB3aWxsIHVzZSB0aGlzCisjIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGFsbCBjb25zdGFudCBvdXRwdXQgaW4gdGhlIHByb3BlciBsYW5ndWFnZS4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogQWZyaWthYW5zLCBBcmFiaWMsIEFybWVuaWFuLCBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsCisjIENoaW5lc2UtVHJhZGl0aW9uYWwsIENyb2F0aWFuLCBDemVjaCwgRGFuaXNoLCBEdXRjaCwgRW5nbGlzaCAoVW5pdGVkIFN0YXRlcyksCisjIEVzcGVyYW50bywgRmFyc2kgKFBlcnNpYW4pLCBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwgR3JlZWssIEh1bmdhcmlhbiwKKyMgSW5kb25lc2lhbiwgSXRhbGlhbiwgSmFwYW5lc2UsIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLAorIyBLb3JlYW4sIEtvcmVhbi1lbiAoS29yZWFuIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksIExhdHZpYW4sIExpdGh1YW5pYW4sCisjIE1hY2Vkb25pYW4sIE5vcndlZ2lhbiwgUGVyc2lhbiAoRmFyc2kpLCBQb2xpc2gsIFBvcnR1Z3Vlc2UsIFJvbWFuaWFuLCBSdXNzaWFuLAorIyBTZXJiaWFuLCBTZXJiaWFuLUN5cmlsbGljLCBTbG92YWssIFNsb3ZlbmUsIFNwYW5pc2gsIFN3ZWRpc2gsIFR1cmtpc2gsCisjIFVrcmFpbmlhbiBhbmQgVmlldG5hbWVzZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEVuZ2xpc2guCisKK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoCisKKyMgSWYgdGhlIEJSSUVGX01FTUJFUl9ERVNDIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBicmllZiBtZW1iZXIKKyMgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbiB0aGUgZmlsZSBhbmQgY2xhc3MKKyMgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhZG9jKS4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBicmllZgorIyBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uCisjCisjIE5vdGU6IElmIGJvdGggSElERV9VTkRPQ19NRU1CRVJTIGFuZCBCUklFRl9NRU1CRVJfREVTQyBhcmUgc2V0IHRvIE5PLCB0aGUKKyMgYnJpZWYgZGVzY3JpcHRpb25zIHdpbGwgYmUgY29tcGxldGVseSBzdXBwcmVzc2VkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCisKKyMgVGhpcyB0YWcgaW1wbGVtZW50cyBhIHF1YXNpLWludGVsbGlnZW50IGJyaWVmIGRlc2NyaXB0aW9uIGFiYnJldmlhdG9yIHRoYXQgaXMKKyMgdXNlZCB0byBmb3JtIHRoZSB0ZXh0IGluIHZhcmlvdXMgbGlzdGluZ3MuIEVhY2ggc3RyaW5nIGluIHRoaXMgbGlzdCwgaWYgZm91bmQKKyMgYXMgdGhlIGxlYWRpbmcgdGV4dCBvZiB0aGUgYnJpZWYgZGVzY3JpcHRpb24sIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgdGV4dAorIyBhbmQgdGhlIHJlc3VsdCwgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkCisjIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuIElmIGxlZnQgYmxhbmssIHRoZQorIyBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkICgkbmFtZSBpcyBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YKKyMgdGhlIGVudGl0eSk6VGhlICRuYW1lIGNsYXNzLCBUaGUgJG5hbWUgd2lkZ2V0LCBUaGUgJG5hbWUgZmlsZSwgaXMsIHByb3ZpZGVzLAorIyBzcGVjaWZpZXMsIGNvbnRhaW5zLCByZXByZXNlbnRzLCBhLCBhbiBhbmQgdGhlLgorCitBQkJSRVZJQVRFX0JSSUVGICAgICAgID0KKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gWUVTCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAorIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCisjIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRlVMTF9QQVRIX05BTUVTICAgICAgICA9IE5PCisKKyMgVGhlIFNUUklQX0ZST01fUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4KKyMgU3RyaXBwaW5nIGlzIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZAorIyBwYXJ0IG9mIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUgcGF0aCB0bworIyBzdHJpcC4KKyMKKyMgTm90ZSB0aGF0IHlvdSBjYW4gc3BlY2lmeSBhYnNvbHV0ZSBwYXRocyBoZXJlLCBidXQgYWxzbyByZWxhdGl2ZSBwYXRocywgd2hpY2gKKyMgd2lsbCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZG94eWdlbiBpcyBzdGFydGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRlVMTF9QQVRIX05BTUVTIGlzIHNldCB0byBZRVMuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPQorCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZQorIyBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscyB0aGUgcmVhZGVyIHdoaWNoCisjIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZgorIyB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZAorIyBzcGVjaWZ5IHRoZSBsaXN0IG9mIGluY2x1ZGUgcGF0aHMgdGhhdCBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorIyB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9CisKKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyIChidXQKKyMgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlzIHlvdXIgZmlsZSBzeXN0ZW1zIGRvZXNuJ3QKKyMgc3VwcG9ydCBsb25nIG5hbWVzIGxpa2Ugb24gRE9TLCBNYWMsIG9yIENELVJPTS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW50ZXJwcmV0IHRoZQorIyBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFkb2Mtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFkb2Mtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtCisjIHN0eWxlIGNvbW1lbnRzICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZgorIyBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PCisKKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0CisjIGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmCisjIHNldCB0byBOTywgdGhlIFF0LXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzCisjIHJlcXVpcmluZyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgZG94eWdlbiB0cmVhdCBhCisjIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8gY29tbWVudHMpIGFzCisjIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gVGhlIG5ldyBkZWZhdWx0IGlzCisjIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBTZXQgdGhpcworIyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvciBpbnN0ZWFkLgorIworIyBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIHRhZyB0byBZRVMgYWxzbyBtZWFucyB0aGF0IHJhdGlvbmFsIHJvc2UgY29tbWVudHMgYXJlCisjIG5vdCByZWNvZ25pemVkIGFueSBtb3JlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhbiB1bmRvY3VtZW50ZWQgbWVtYmVyIGluaGVyaXRzIHRoZQorIyBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQgcmUtaW1wbGVtZW50cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZSBhIG5ldworIyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsIGJlIHBhcnQKKyMgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuIERveHlnZW4KKyMgdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDE2LCBkZWZhdWx0IHZhbHVlOiA0LgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gNAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdCBhcyBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtOgorIyBuYW1lPXZhbHVlCisjIEZvciBleGFtcGxlIGFkZGluZworIyAic2lkZWVmZmVjdD1AcGFyIFNpZGUgRWZmZWN0czpcbiIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlCisjIGRvY3VtZW50YXRpb24sIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcKKyMgIlNpZGUgRWZmZWN0czoiLiBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydAorIyBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9CisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiB3b3JkLWtleXdvcmQgbWFwcGluZ3MgKFRDTCBvbmx5KS4KKyMgQSBtYXBwaW5nIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuIEZvciBleGFtcGxlIGFkZGluZyAiY2xhc3M9aXRjbDo6Y2xhc3MiCisjIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aGUgY29tbWFuZCBjbGFzcyBpbiB0aGUgaXRjbDo6Y2xhc3MgbWVhbmluZy4KKworVENMX1NVQlNUICAgICAgICAgICAgICA9CisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzCisjIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIEZvcgorIyBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3Qgb2YgYWxsCisjIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCisjIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKKyMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKKyMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBGb3J0cmFuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCisjIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAorIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4gKGZpeGVkIGZvcm1hdCBGb3J0cmFuOgorIyBGb3J0cmFuRml4ZWQsIGZyZWUgZm9ybWF0dGVkIEZvcnRyYW46IEZvcnRyYW5GcmVlLCB1bmtub3duIGZvcm1hdHRlZCBGb3J0cmFuOgorIyBGb3J0cmFuLiBJbiB0aGUgbGF0ZXIgY2FzZSB0aGUgcGFyc2VyIHRyaWVzIHRvIGd1ZXNzIHdoZXRoZXIgdGhlIGNvZGUgaXMgZml4ZWQKKyMgb3IgZnJlZSBmb3JtYXR0ZWQgY29kZSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgRm9ydHJhbiB0eXBlIGZpbGVzKSwgVkhETC4gRm9yCisjIGluc3RhbmNlIHRvIG1ha2UgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwKKyMgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgorIworIyBOb3RlOiBGb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb24geW91IGNhbiB1c2Ugbm9fZXh0ZW5zaW9uIGFzIGEgcGxhY2Vob2xkZXIuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UKKyMgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0KKworIyBJZiB0aGUgTUFSS0RPV05fU1VQUE9SVCB0YWcgaXMgZW5hYmxlZCB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwgY29tbWVudHMKKyMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UgY2FuCisjIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4gRGlzYWJsZSBvbmx5IGluCisjIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFRPQ19JTkNMVURFX0hFQURJTkdTIHRhZyBpcyBzZXQgdG8gYSBub24temVybyB2YWx1ZSwgYWxsIGhlYWRpbmdzIHVwCisjIHRvIHRoYXQgbGV2ZWwgYXJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gdGhlIHRhYmxlIG9mIGNvbnRlbnRzLCBldmVuIGlmCisjIHRoZXkgZG8gbm90IGhhdmUgYW4gaWQgYXR0cmlidXRlLgorIyBOb3RlOiBUaGlzIGZlYXR1cmUgY3VycmVudGx5IGFwcGxpZXMgb25seSB0byBNYXJrZG93biBoZWFkaW5ncy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOTksIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBNQVJLRE9XTl9TVVBQT1JUIGlzIHNldCB0byBZRVMuCisKKyMgVE9DX0lOQ0xVREVfSEVBRElOR1MgPSAwCisKKyMgV2hlbiBlbmFibGVkIGRveHlnZW4gdHJpZXMgdG8gbGluayB3b3JkcyB0aGF0IGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRlZAorIyBjbGFzc2VzLCBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuCisjIGJlIHByZXZlbnRlZCBpbiBpbmRpdmlkdWFsIGNhc2VzIGJ5IHB1dHRpbmcgYSAlIHNpZ24gaW4gZnJvbnQgb2YgdGhlIHdvcmQgb3IKKyMgZ2xvYmFsbHkgYnkgc2V0dGluZyBBVVRPTElOS19TVVBQT1JUIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitBVVRPTElOS19TVVBQT1JUICAgICAgID0gWUVTCisKKyMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudAorIyB0byBpbmNsdWRlIChhIHRhZyBmaWxlIGZvcikgdGhlIFNUTCBzb3VyY2VzIGFzIGlucHV0LCB0aGVuIHlvdSBzaG91bGQgc2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZAorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsKKyMgdmVyc3VzIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2UgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uCisjIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gWUVTCisKKyMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8KKyMgZW5hYmxlIHBhcnNpbmcgc3VwcG9ydC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUFBfQ0xJX1NVUFBPUlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCAoc2VlOgorIyBodHRwOi8vd3d3LnJpdmVyYmFua2NvbXB1dGluZy5jby51ay9zb2Z0d2FyZS9zaXAvaW50cm8pIHNvdXJjZXMgb25seS4gRG94eWdlbgorIyB3aWxsIHBhcnNlIHRoZW0gbGlrZSBub3JtYWwgQysrIGJ1dCB3aWxsIGFzc3VtZSBhbGwgY2xhc3NlcyB1c2UgcHVibGljIGluc3RlYWQKKyMgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTworCisjIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZQorIyBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIFlFUyB3aWxsIG1ha2UKKyMgZG94eWdlbiB0byByZXBsYWNlIHRoZSBnZXQgYW5kIHNldCBtZXRob2RzIGJ5IGEgcHJvcGVydHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG1ldGhvZHMgYXJlIGluZGVlZCBnZXR0aW5nIG9yIHNldHRpbmcgYSBzaW1wbGUKKyMgdHlwZS4gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIG9yIHlvdSB3YW50IHRvIHNob3cgdGhlIG1ldGhvZHMgYW55d2F5LCB5b3UKKyMgc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSURMX1BST1BFUlRZX1NVUFBPUlQgICA9IFlFUworCisjIElmIG1lbWJlciBncm91cGluZyBpcyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgRElTVFJJQlVURV9HUk9VUF9ET0MKKyMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0CisjIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdAorIyBhbGwgbWVtYmVycyBvZiBhIGdyb3VwIG11c3QgYmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworCisjIElmIG9uZSBhZGRzIGEgc3RydWN0IG9yIGNsYXNzIHRvIGEgZ3JvdXAgYW5kIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoZW4gYWxzbworIyBhbnkgbmVzdGVkIGNsYXNzIG9yIHN0cnVjdCBpcyBhZGRlZCB0byB0aGUgc2FtZSBncm91cC4gQnkgZGVmYXVsdCB0aGlzIG9wdGlvbgorIyBpcyBkaXNhYmxlZCBhbmQgb25lIGhhcyB0byBhZGQgbmVzdGVkIGNvbXBvdW5kcyBleHBsaWNpdGx5IHZpYSBcaW5ncm91cC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHUk9VUF9ORVNURURfQ09NUE9VTkRTID0gWUVTCisKKyMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgdGhlIHNhbWUgdHlwZQorIyAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEgc3ViZ3JvdXAgb2YgdGhhdAorIyB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gTk8gdG8gcHJldmVudAorIyBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgdGhlCisjIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMKKyMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcgXGluZ3JvdXApCisjIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVgKKyMgYW5kIFJURikuCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBpbiBjb21iaW5hdGlvbiB3aXRoCisjIFNFUEFSQVRFX01FTUJFUl9QQUdFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMKKyMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyBvciBzaW1wbGUgdHlwZWRlZiBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBncm91cCBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQKKyMgdG8gTk8sIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kCisjIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTworCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgdGFnIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yCisjIGVudW0gaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkgYmUKKyMgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBOTworCisjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgbG9va3VwIGNhY2hlIGNhbiBiZSBzZXQgdXNpbmcgTE9PS1VQX0NBQ0hFX1NJWkUuIFRoaXMKKyMgY2FjaGUgaXMgdXNlZCB0byByZXNvbHZlIHN5bWJvbHMgZ2l2ZW4gdGhlaXIgbmFtZSBhbmQgc2NvcGUuIFNpbmNlIHRoaXMgY2FuIGJlCisjIGFuIGV4cGVuc2l2ZSBwcm9jZXNzIGFuZCBvZnRlbiB0aGUgc2FtZSBzeW1ib2wgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyBpbiB0aGUKKyMgY29kZSwgZG94eWdlbiBrZWVwcyBhIGNhY2hlIG9mIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsCisjIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLiBJZiB0aGUgY2FjaGUgaXMgdG9vIGxhcmdlLCBtZW1vcnkgaXMgd2FzdGVkLiBUaGUKKyMgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6IDJeKDE2K0xPT0tVUF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlCisjIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTY9NjU1MzYKKyMgc3ltYm9scy4gQXQgdGhlIGVuZCBvZiBhIHJ1biBkb3h5Z2VuIHdpbGwgcmVwb3J0IHRoZSBjYWNoZSB1c2FnZSBhbmQgc3VnZ2VzdAorIyB0aGUgb3B0aW1hbCBjYWNoZSBzaXplIGZyb20gYSBzcGVlZCBwb2ludCBvZiB2aWV3LgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5LCBkZWZhdWx0IHZhbHVlOiAwLgorCitMT09LVVBfQ0FDSEVfU0laRSAgICAgID0gMAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbgorIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4gUHJpdmF0ZQorIyBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcyB0aGUKKyMgRVhUUkFDVF9QUklWQVRFIHJlc3BlY3RpdmVseSBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTLgorIyBOb3RlOiBUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIHRoZSB3YXJuaW5ncyBhYm91dCB1bmRvY3VtZW50ZWQgbWVtYmVycyB0aGF0IGFyZQorIyBub3JtYWxseSBwcm9kdWNlZCB3aGVuIFdBUk5JTkdTIGlzIHNldCB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9BTEwgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyB3aWxsCisjIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1BBQ0tBR0UgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBtZW1iZXJzIHdpdGggcGFja2FnZSBvciBpbnRlcm5hbAorIyBzY29wZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfUEFDS0FHRSAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZSB3aWxsIGJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzIChhbmQgc3RydWN0cykgZGVmaW5lZAorIyBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8sCisjIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuIERvZXMgbm90IGhhdmUgYW55IGVmZmVjdAorIyBmb3IgSmF2YSBzb3VyY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBJZiBzZXQgdG8gWUVTLCBsb2NhbCBtZXRob2RzLAorIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8sIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQorIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQKKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZSBuYW1lIG9mCisjIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQgYW5vbnltb3VzIG5hbWVzcGFjZQorIyBhcmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBpbnNpZGUgZG9jdW1lbnRlZCBjbGFzc2VzIG9yIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlc2UKKyMgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24KKyMgc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiBJZiBzZXQKKyMgdG8gTk8sIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MuIFRoaXMgb3B0aW9uCisjIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwgZnJpZW5kCisjIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4gSWYgc2V0IHRvIE5PLCB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGVzZQorIyBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24gdGhhdCBpcyB0eXBlZCBhZnRlciBhCisjIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldCB0byBOTyB0aGVuIHRoZSBkb2N1bWVudGF0aW9uCisjIHdpbGwgYmUgZXhjbHVkZWQuIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUgZmlsZQorIyBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMsIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbworIyBhbGxvd2VkLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjbGFzc2VzIG9yIGZpbGVzIHdob3NlIG5hbWVzIG9ubHkgZGlmZmVyCisjIGluIGNhc2UgYW5kIGlmIHlvdXIgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgY2FzZSBzZW5zaXRpdmUgZmlsZSBuYW1lcy4gV2luZG93cworIyBhbmQgTWFjIHVzZXJzIGFyZSBhZHZpc2VkIHRvIHNldCB0aGlzIG9wdGlvbiB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHN5c3RlbSBkZXBlbmRlbnQuCisKK0NBU0VfU0VOU0VfTkFNRVMgICAgICAgPSBZRVMKKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgbWVtYmVycyB3aXRoCisjIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMsIHRoZQorIyBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9DT01QT1VORF9SRUZFUkVOQ0UgdGFnIGlzIHNldCB0byBOTyAoZGVmYXVsdCkgdGhlbiBkb3h5Z2VuIHdpbGwKKyMgYXBwZW5kIGFkZGl0aW9uYWwgdGV4dCB0byBhIHBhZ2UncyB0aXRsZSwgc3VjaCBhcyBDbGFzcyBSZWZlcmVuY2UuIElmIHNldCB0bworIyBZRVMgdGhlIGNvbXBvdW5kIHJlZmVyZW5jZSB3aWxsIGJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0NPTVBPVU5EX1JFRkVSRU5DRT0gTk8KKworIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHB1dCBhIGxpc3Qgb2YKKyMgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGZpbGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKKworIyBJZiB0aGUgU0hPV19HUk9VUEVEX01FTUJfSU5DIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIGFkZCBmb3IgZWFjaAorIyBncm91cGVkIG1lbWJlciBhbiBpbmNsdWRlIHN0YXRlbWVudCB0byB0aGUgZG9jdW1lbnRhdGlvbiwgdGVsbGluZyB0aGUgcmVhZGVyCisjIHdoaWNoIGZpbGUgdG8gaW5jbHVkZSBpbiBvcmRlciB0byB1c2UgdGhlIG1lbWJlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSE9XX0dST1VQRURfTUVNQl9JTkMgID0gTk8KKworIyBJZiB0aGUgRk9SQ0VfTE9DQUxfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbGlzdCBpbmNsdWRlCisjIGZpbGVzIHdpdGggZG91YmxlIHF1b3RlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiByYXRoZXIgdGhhbiB3aXRoIHNoYXJwIGJyYWNrZXRzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0ZPUkNFX0xPQ0FMX0lOQ0xVREVTICAgPSBOTworCisjIElmIHRoZSBJTkxJTkVfSU5GTyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgdGFnIFtpbmxpbmVdIGlzIGluc2VydGVkIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlcgorIyBuYW1lLiBJZiBzZXQgdG8gTk8sIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIGRlY2xhcmF0aW9uIG9yZGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTT1JUX01FTUJFUl9ET0NTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBicmllZgorIyBkZXNjcmlwdGlvbnMgb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlcgorIyBuYW1lLiBJZiBzZXQgdG8gTk8sIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIGRlY2xhcmF0aW9uIG9yZGVyLiBOb3RlIHRoYXQKKyMgdGhpcyB3aWxsIGFsc28gaW5mbHVlbmNlIHRoZSBvcmRlciBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgY2xhc3MgbGlzdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQgY29uc3RydWN0b3JzIGFuZAorIyBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUKKyMgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieSBTT1JUX0JSSUVGX0RPQ1MgYW5kIFNPUlRfTUVNQkVSX0RPQ1MuCisjIE5vdGU6IElmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZyBicmllZgorIyBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgTm90ZTogSWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZworIyBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfR1JPVVBfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgaGllcmFyY2h5CisjIG9mIGdyb3VwIG5hbWVzIGludG8gYWxwaGFiZXRpY2FsIG9yZGVyLiBJZiBzZXQgdG8gTk8gdGhlIGdyb3VwIG5hbWVzIHdpbGwKKyMgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9HUk9VUF9OQU1FUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JZX1NDT1BFX05BTUUgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUgc29ydGVkIGJ5CisjIGZ1bGx5LXF1YWxpZmllZCBuYW1lcywgaW5jbHVkaW5nIG5hbWVzcGFjZXMuIElmIHNldCB0byBOTywgdGhlIGNsYXNzIGxpc3Qgd2lsbAorIyBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLCBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4KKyMgTm90ZTogVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsIGlmIEhJREVfU0NPUEVfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlIGFscGhhYmV0aWNhbAorIyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQllfU0NPUEVfTkFNRSAgICAgPSBOTworCisjIElmIHRoZSBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIGRveHlnZW4gZmFpbHMgdG8gZG8gcHJvcGVyCisjIHR5cGUgcmVzb2x1dGlvbiBvZiBhbGwgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIGl0IHdpbGwgcmVqZWN0IGEgbWF0Y2ggYmV0d2VlbgorIyB0aGUgcHJvdG90eXBlIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtZW1iZXIgZnVuY3Rpb24gZXZlbiBpZiB0aGVyZSBpcworIyBvbmx5IG9uZSBjYW5kaWRhdGUgb3IgaXQgaXMgb2J2aW91cyB3aGljaCBjYW5kaWRhdGUgdG8gY2hvb3NlIGJ5IGRvaW5nIGEKKyMgc2ltcGxlIHN0cmluZyBtYXRjaC4gQnkgZGlzYWJsaW5nIFNUUklDVF9QUk9UT19NQVRDSElORyBkb3h5Z2VuIHdpbGwgc3RpbGwKKyMgYWNjZXB0IGEgbWF0Y2ggYmV0d2VlbiBwcm90b3R5cGUgYW5kIGltcGxlbWVudGF0aW9uIGluIHN1Y2ggY2FzZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU1RSSUNUX1BST1RPX01BVENISU5HICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgZGlzYWJsZSAoTk8pIHRoZSB0b2RvCisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8gY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfVEVTVExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciBkaXNhYmxlIChOTykgdGhlIHRlc3QKKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdCBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgZGlzYWJsZSAoTk8pIHRoZSBidWcKKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgZGlzYWJsZSAoTk8pCisjIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKKworIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsIGRvY3VtZW50YXRpb24KKyMgc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgPHNlY3Rpb25fbGFiZWw+IC4uLiBcZW5kaWYgYW5kIFxjb25kIDxzZWN0aW9uX2xhYmVsPgorIyAuLi4gXGVuZGNvbmQgYmxvY2tzLgorCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0KKworIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0aGF0IHRoZQorIyBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gLyBkZWZpbmUgY2FuIGhhdmUgZm9yIGl0IHRvIGFwcGVhciBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQgaGVyZQorIyBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LiBUaGUKKyMgYXBwZWFyYW5jZSBvZiB0aGUgdmFsdWUgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyAvIGRlZmluZXMgY2FuIGJlCisjIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyIGNvbW1hbmQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiAzMC4KKworTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCisKKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGF0CisjIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3NlcyBhbmQgc3RydWN0cy4gSWYgc2V0IHRvIFlFUywgdGhlCisjIGxpc3Qgd2lsbCBtZW50aW9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCisjIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldworIyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCisjIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQorIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAorIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKKyMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0KKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZAorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZAorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLiBZb3UgY2FuCisjIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkIERveHlnZW5MYXlvdXQueG1sCisjIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCisjCisjIE5vdGUgdGhhdCBpZiB5b3UgcnVuIGRveHlnZW4gZnJvbSBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgZmlsZSBjYWxsZWQKKyMgRG94eWdlbkxheW91dC54bWwsIGRveHlnZW4gd2lsbCBwYXJzZSBpdCBhdXRvbWF0aWNhbGx5IGV2ZW4gaWYgdGhlIExBWU9VVF9GSUxFCisjIHRhZyBpcyBsZWZ0IGVtcHR5LgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0KKworIyBUaGUgQ0lURV9CSUJfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgYmliIGZpbGVzIGNvbnRhaW5pbmcKKyMgdGhlIHJlZmVyZW5jZSBkZWZpbml0aW9ucy4gVGhpcyBtdXN0IGJlIGEgbGlzdCBvZiAuYmliIGZpbGVzLiBUaGUgLmJpYgorIyBleHRlbnNpb24gaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiBvbWl0dGVkLiBUaGlzIHJlcXVpcmVzIHRoZSBiaWJ0ZXggdG9vbAorIyB0byBiZSBpbnN0YWxsZWQuIFNlZSBhbHNvIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGZvciBtb3JlIGluZm8uCisjIEZvciBMYVRlWCB0aGUgc3R5bGUgb2YgdGhlIGJpYmxpb2dyYXBoeSBjYW4gYmUgY29udHJvbGxlZCB1c2luZworIyBMQVRFWF9CSUJfU1RZTEUuIFRvIHVzZSB0aGlzIGZlYXR1cmUgeW91IG5lZWQgYmlidGV4IGFuZCBwZXJsIGF2YWlsYWJsZSBpbiB0aGUKKyMgc2VhcmNoIHBhdGguIFNlZSBhbHNvIFxjaXRlIGZvciBpbmZvIGhvdyB0byBjcmVhdGUgcmVmZXJlbmNlcy4KKworQ0lURV9CSUJfRklMRVMgICAgICAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdG8KKyMgc3RhbmRhcmQgb3V0cHV0IGJ5IGRveHlnZW4uIElmIFFVSUVUIGlzIHNldCB0byBZRVMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlCisjIG1lc3NhZ2VzIGFyZSBvZmYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IFlFUworCisjIFRoZSBXQVJOSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBhcmUKKyMgZ2VuZXJhdGVkIHRvIHN0YW5kYXJkIGVycm9yIChzdGRlcnIpIGJ5IGRveHlnZW4uIElmIFdBUk5JTkdTIGlzIHNldCB0byBZRVMKKyMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIHdhcm5pbmdzIGFyZSBvbi4KKyMKKyMgVGlwOiBUdXJuIHdhcm5pbmdzIG9uIHdoaWxlIHdyaXRpbmcgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgV0FSTl9JRl9VTkRPQ1VNRU5URUQgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUKKyMgd2FybmluZ3MgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnCisjIHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX0RPQ19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcgorIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lIHBhcmFtZXRlcnMKKyMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcKKyMgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3IgZnVuY3Rpb25zIHRoYXQKKyMgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMgb3IgcmV0dXJuCisjIHZhbHVlLiBJZiBzZXQgdG8gTk8sIGRveHlnZW4gd2lsbCBvbmx5IHdhcm4gYWJvdXQgd3Jvbmcgb3IgaW5jb21wbGV0ZQorIyBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbiwgYnV0IG5vdCBhYm91dCB0aGUgYWJzZW5jZSBvZiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBZRVMKKworIyBJZiB0aGUgV0FSTl9BU19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbW1lZGlhdGVseSBzdG9wIHdoZW4KKyMgYSB3YXJuaW5nIGlzIGVuY291bnRlcmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1dBUk5fQVNfRVJST1IgICAgICAgICAgPSBOTworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgZG94eWdlbgorIyBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgdGFncywgd2hpY2gKKyMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUgd2FybmluZyBvcmlnaW5hdGVkCisjIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4gJHZlcnNpb24sIHdoaWNoIHdpbGwKKyMgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIGJlIG9idGFpbmVkIHZpYQorIyBGSUxFX1ZFUlNJT05fRklMVEVSKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogJGZpbGU6JGxpbmU6ICR0ZXh0LgorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nIGFuZCBlcnJvcgorIyBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKKyMgZXJyb3IgKHN0ZGVycikuCisKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBJTlBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSBteWZpbGUuY3BwIG9yCisjIGRpcmVjdG9yaWVzIGxpa2UgL3Vzci9zcmMvbXlwcm9qZWN0LiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgd2l0aAorIyBzcGFjZXMuIFNlZSBhbHNvIEZJTEVfUEFUVEVSTlMgYW5kIEVYVEVOU0lPTl9NQVBQSU5HCisjIE5vdGU6IElmIHRoaXMgdGFnIGlzIGVtcHR5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBzZWFyY2hlZC4KKworSU5QVVQgICAgICAgICAgICAgICAgICA9IHNyYworCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzCisjIHRoYXQgZG94eWdlbiBwYXJzZXMuIEludGVybmFsbHkgZG94eWdlbiB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZy4gRG94eWdlbiB1c2VzCisjIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgdGhlIGxpYmljb252CisjIGRvY3VtZW50YXRpb24gKHNlZTogaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252KSBmb3IgdGhlIGxpc3Qgb2YKKyMgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCisKK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyAobGlrZSAqLmNwcCBhbmQKKyMgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbworIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKKyMgcmVhZCBieSBkb3h5Z2VuLgorIworIyBJZiBsZWZ0IGJsYW5rIHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDoqLmMsICouY2MsICouY3h4LCAqLmNwcCwKKyMgKi5jKyssICouamF2YSwgKi5paSwgKi5peHgsICouaXBwLCAqLmkrKywgKi5pbmwsICouaWRsLCAqLmRkbCwgKi5vZGwsICouaCwKKyMgKi5oaCwgKi5oeHgsICouaHBwLCAqLmgrKywgKi5jcywgKi5kLCAqLnBocCwgKi5waHA0LCAqLnBocDUsICoucGh0bWwsICouaW5jLAorIyAqLm0sICoubWFya2Rvd24sICoubWQsICoubW0sICouZG94LCAqLnB5LCAqLnB5dywgKi5mOTAsICouZjk1LCAqLmYwMywgKi5mMDgsCisjICouZiwgKi5mb3IsICoudGNsLCAqLnZoZCwgKi52aGRsLCAqLnVjZiBhbmQgKi5xc2YuCisKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPQorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgc2hvdWxkCisjIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUKKyMgZXhjbHVkZWQgZnJvbSB0aGUgSU5QVVQgc291cmNlIGZpbGVzLiBUaGlzIHdheSB5b3UgY2FuIGVhc2lseSBleGNsdWRlIGEKKyMgc3ViZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgdHJlZSB3aG9zZSByb290IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBJTlBVVCB0YWcuCisjCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLgorCitFWENMVURFICAgICAgICAgICAgICAgID0KKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCisjIGZyb20gdGhlIGlucHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPQorCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0CisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1NZTUJPTFMgICAgICAgID0KKworIyBUaGUgRVhBTVBMRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUgdGhlIFxpbmNsdWRlCisjIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0KKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayBhbGwKKyMgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0KKworIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSBjb21tYW5kcworIyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQU1QTEVfUkVDVVJTSVZFICAgICAgPSBOTworCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIHRoYXQgY29udGFpbiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKKyMgXGltYWdlIGNvbW1hbmQpLgorCitJTUFHRV9QQVRIICAgICAgICAgICAgID0KKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQ6CisjCisjIDxmaWx0ZXI+IDxpbnB1dC1maWxlPgorIworIyB3aGVyZSA8ZmlsdGVyPiBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlCisjIG5hbWUgb2YgYW4gaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyCisjIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcKKyMgd2lsbCBiZSBpZ25vcmVkLgorIworIyBOb3RlIHRoYXQgdGhlIGZpbHRlciBtdXN0IG5vdCBhZGQgb3IgcmVtb3ZlIGxpbmVzOyBpdCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUKKyMgY29kZSBpcyBzY2FubmVkLCBidXQgbm90IHdoZW4gdGhlIG91dHB1dCBjb2RlIGlzIGdlbmVyYXRlZC4gSWYgbGluZXMgYXJlIGFkZGVkCisjIG9yIHJlbW92ZWQsIHRoZSBhbmNob3JzIHdpbGwgbm90IGJlIHBsYWNlZCBjb3JyZWN0bHkuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyBwcm9wZXJseSBwcm9jZXNzZWQgYnkgZG94eWdlbi4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9CisKKyMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybgorIyBiYXNpcy4gRG94eWdlbiB3aWxsIGNvbXBhcmUgdGhlIGZpbGUgbmFtZSB3aXRoIGVhY2ggcGF0dGVybiBhbmQgYXBwbHkgdGhlCisjIGZpbHRlciBpZiB0aGVyZSBpcyBhIG1hdGNoLiBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOiBwYXR0ZXJuPWZpbHRlcgorIyAobGlrZSAqLmNwcD1teV9jcHBfZmlsdGVyKS4gU2VlIElOUFVUX0ZJTFRFUiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiBob3cKKyMgZmlsdGVycyBhcmUgdXNlZC4gSWYgdGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgaXMgZW1wdHkgb3IgaWYgbm9uZSBvZiB0aGUKKyMgcGF0dGVybnMgbWF0Y2ggdGhlIGZpbGUgbmFtZSwgSU5QVVRfRklMVEVSIGlzIGFwcGxpZWQuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyBwcm9wZXJseSBwcm9jZXNzZWQgYnkgZG94eWdlbi4KKworRklMVEVSX1BBVFRFUk5TICAgICAgICA9CisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIpIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKKyMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCisKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpIGFuZAorIyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuIHVzaW5nCisjICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBzZXQgdG8gWUVTLgorCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0KKworIyBJZiB0aGUgVVNFX01ERklMRV9BU19NQUlOUEFHRSB0YWcgcmVmZXJzIHRvIHRoZSBuYW1lIG9mIGEgbWFya2Rvd24gZmlsZSB0aGF0CisjIGlzIHBhcnQgb2YgdGhlIGlucHV0LCBpdHMgY29udGVudHMgd2lsbCBiZSBwbGFjZWQgb24gdGhlIG1haW4gcGFnZQorIyAoaW5kZXguaHRtbCkuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHByb2plY3Qgb24gZm9yIGluc3RhbmNlIEdpdEh1YgorIyBhbmQgd2FudCB0byByZXVzZSB0aGUgaW50cm9kdWN0aW9uIHBhZ2UgYWxzbyBmb3IgdGhlIGRveHlnZW4gb3V0cHV0LgorCitVU0VfTURGSUxFX0FTX01BSU5QQUdFID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAorIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCisjIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uCisjIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgdGFnIGlzIHNldCB0byBZRVMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQKKyMgdG8gWUVTIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbSBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQKKyMgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsIGxpbmsgdG8gdGhlIHNvdXJjZSBjb2RlLiBPdGhlcndpc2UgdGhleSB3aWxsCisjIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKKworIyBJZiBTT1VSQ0VfVE9PTFRJUFMgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIHRoZW4gaG92ZXJpbmcgYSBoeXBlcmxpbmsgaW4gdGhlCisjIHNvdXJjZSBjb2RlIHdpbGwgc2hvdyBhIHRvb2x0aXAgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgcHJvdG90eXBlLAorIyBicmllZiBkZXNjcmlwdGlvbiBhbmQgbGlua3MgdG8gdGhlIGRlZmluaXRpb24gYW5kIGRvY3VtZW50YXRpb24uIFNpbmNlIHRoaXMKKyMgd2lsbCBtYWtlIHRoZSBIVE1MIGZpbGUgbGFyZ2VyIGFuZCBsb2FkaW5nIG9mIGxhcmdlIGZpbGVzIGEgYml0IHNsb3dlciwgeW91CisjIGNhbiBvcHQgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgorCitTT1VSQ0VfVE9PTFRJUFMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlIHdpbGwKKyMgcG9pbnQgdG8gdGhlIEhUTUwgZ2VuZXJhdGVkIGJ5IHRoZSBodGFncygxKSB0b29sIGluc3RlYWQgb2YgZG94eWdlbiBidWlsdC1pbgorIyBzb3VyY2UgYnJvd3Nlci4gVGhlIGh0YWdzIHRvb2wgaXMgcGFydCBvZiBHTlUncyBnbG9iYWwgc291cmNlIHRhZ2dpbmcgc3lzdGVtCisjIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdSB3aWxsIG5lZWQgdmVyc2lvbgorIyA0LjguNiBvciBoaWdoZXIuCisjCisjIFRvIHVzZSBpdCBkbyB0aGUgZm9sbG93aW5nOgorIyAtIEluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGdsb2JhbAorIyAtIEVuYWJsZSBTT1VSQ0VfQlJPV1NFUiBhbmQgVVNFX0hUQUdTIGluIHRoZSBjb25maWcgZmlsZQorIyAtIE1ha2Ugc3VyZSB0aGUgSU5QVVQgcG9pbnRzIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZQorIyAtIFJ1biBkb3h5Z2VuIGFzIG5vcm1hbAorIworIyBEb3h5Z2VuIHdpbGwgaW52b2tlIGh0YWdzIChhbmQgdGhhdCB3aWxsIGluIHR1cm4gaW52b2tlIGd0YWdzKSwgc28gdGhlc2UKKyMgdG9vbHMgbXVzdCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lIChpLmUuIGluIHRoZSBzZWFyY2ggcGF0aCkuCisjCisjIFRoZSByZXN1bHQ6IGluc3RlYWQgb2YgdGhlIHNvdXJjZSBicm93c2VyIGdlbmVyYXRlZCBieSBkb3h5Z2VuLCB0aGUgbGlua3MgdG8KKyMgc291cmNlIGNvZGUgd2lsbCBub3cgcG9pbnQgdG8gdGhlIG91dHB1dCBvZiBodGFncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KKworVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0aGUgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgdmVyYmF0aW0gY29weSBvZiB0aGUgaGVhZGVyIGZpbGUgZm9yIGVhY2ggY2xhc3MgZm9yIHdoaWNoIGFuIGluY2x1ZGUgaXMKKyMgc3BlY2lmaWVkLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBTZWUgYWxzbzogU2VjdGlvbiBcY2xhc3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ0xBTkdfQVNTSVNURURfUEFSU0lORyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCB1c2UgdGhlCisjIGNsYW5nIHBhcnNlciAoc2VlOiBodHRwOi8vY2xhbmcubGx2bS5vcmcvKSBmb3IgbW9yZSBhY2N1cmF0ZSBwYXJzaW5nIGF0IHRoZQorIyBjb3N0IG9mIHJlZHVjZWQgcGVyZm9ybWFuY2UuIFRoaXMgY2FuIGJlIHBhcnRpY3VsYXJseSBoZWxwZnVsIHdpdGggdGVtcGxhdGUKKyMgcmljaCBDKysgY29kZSBmb3Igd2hpY2ggZG94eWdlbidzIGJ1aWx0LWluIHBhcnNlciBsYWNrcyB0aGUgbmVjZXNzYXJ5IHR5cGUKKyMgaW5mb3JtYXRpb24uCisjIE5vdGU6IFRoZSBhdmFpbGFiaWxpdHkgb2YgdGhpcyBvcHRpb24gZGVwZW5kcyBvbiB3aGV0aGVyIG9yIG5vdCBkb3h5Z2VuIHdhcworIyBnZW5lcmF0ZWQgd2l0aCB0aGUgLUR1c2UtbGliY2xhbmc9T04gb3B0aW9uIGZvciBDTWFrZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCisjIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgPSBOTworCisjIElmIGNsYW5nIGFzc2lzdGVkIHBhcnNpbmcgaXMgZW5hYmxlZCB5b3UgY2FuIHByb3ZpZGUgdGhlIGNvbXBpbGVyIHdpdGggY29tbWFuZAorIyBsaW5lIG9wdGlvbnMgdGhhdCB5b3Ugd291bGQgbm9ybWFsbHkgdXNlIHdoZW4gaW52b2tpbmcgdGhlIGNvbXBpbGVyLiBOb3RlIHRoYXQKKyMgdGhlIGluY2x1ZGUgcGF0aHMgd2lsbCBhbHJlYWR5IGJlIHNldCBieSBkb3h5Z2VuIGZvciB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisjIHNwZWNpZmllZCB3aXRoIElOUFVUIGFuZCBJTkNMVURFX1BBVEguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIGlzIHNldCB0byBZRVMuCisKKyMgQ0xBTkdfT1BUSU9OUyAgICAgICAgICA9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCBvZiBhbGwKKyMgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIGxvdCBvZgorIyBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUworCisjIFRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbgorIyB3aGljaCB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGxpc3Qgd2lsbCBiZSBzcGxpdC4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIGNsYXNzZXMgd2lsbAorIyBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguIFRoZSBJR05PUkVfUFJFRklYIHRhZworIyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJlZml4IChvciBhIGxpc3Qgb2YgcHJlZml4ZXMpIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKKyMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgorCitJR05PUkVfUFJFRklYICAgICAgICAgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIEhUTUwgb3V0cHV0CisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKKworIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBodG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gLi8KKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sIC5waHAsIC5hc3ApLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLmh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGhlYWRlciBmaWxlIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuCisjCisjIFRvIGdldCB2YWxpZCBIVE1MIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGluY2x1ZGVzIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMKKyMgdGhhdCBkb3h5Z2VuIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIChlLmcuCisjIHRoZSBzZXR0aW5nIEdFTkVSQVRFX1RSRUVWSUVXKS4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYQorIyBkZWZhdWx0IGhlYWRlciB1c2luZworIyBkb3h5Z2VuIC13IGh0bWwgbmV3X2hlYWRlci5odG1sIG5ld19mb290ZXIuaHRtbCBuZXdfc3R5bGVzaGVldC5jc3MKKyMgWW91ckNvbmZpZ0ZpbGUKKyMgYW5kIHRoZW4gbW9kaWZ5IHRoZSBmaWxlIG5ld19oZWFkZXIuaHRtbC4gU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIKKyMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBoZWFkZXIgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5CisjIHVzZXMuCisjIE5vdGU6IFRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuLiBGb3IgYSBkZXNjcmlwdGlvbgorIyBvZiB0aGUgcG9zc2libGUgbWFya2VycyBhbmQgYmxvY2sgbmFtZXMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gLi4vZG9jcy9uYW1lZF9kYXRhX3RoZW1lL25hbWVkX2RhdGFfaGVhZGVyLmh0bWwKKworIyBUaGUgSFRNTF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBmb290ZXIgZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkCisjIGZvb3Rlci4gU2VlIEhUTUxfSEVBREVSIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSBhIGRlZmF1bHQKKyMgZm9vdGVyIGFuZCB3aGF0IHNwZWNpYWwgY29tbWFuZHMgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSBmb290ZXIuIFNlZSBhbHNvCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgZm9vdGVyCisjIHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0ZPT1RFUiAgICAgICAgICAgID0gLi4vZG9jcy9uYW1lZF9kYXRhX3RoZW1lL25hbWVkX2RhdGFfZm9vdGVyLmh0bWwKKworIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZQorIyBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgbG9vayBvZgorIyB0aGUgSFRNTCBvdXRwdXQuIElmIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4KKyMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgc3R5bGUKKyMgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIE5vdGU6IEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIHRhZywgYXMKKyMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMgdGFnIChIVE1MX1NUWUxFU0hFRVQpIHdpbGwgaW4gdGhlIGZ1dHVyZSBiZWNvbWUKKyMgb2Jzb2xldGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAuLi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL25hbWVkX2RhdGFfZG94eWdlbi5jc3MKKworIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgdXNlci1kZWZpbmVkCisjIGNhc2NhZGluZyBzdHlsZSBzaGVldHMgdGhhdCBhcmUgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0cworIyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUgY2VydGFpbiBzdHlsZSBhc3BlY3RzLgorIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVCBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZQorIyBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3JlIG1vcmUgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlcyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgTm90ZTogVGhlIG9yZGVyIG9mIHRoZSBleHRyYSBzdHlsZSBzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlIHNoZWV0IGluIHRoZSBsaXN0IG92ZXJydWxlcyB0aGUgc2V0dGluZyBvZiB0aGUgcHJldmlvdXMgb25lcyBpbiB0aGUKKyMgbGlzdCkuIEZvciBhbiBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9CisKKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKKyMgJHJlbHBhdGheIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQgdGhlCisjIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPSAuLi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2RveHlnZW4uY3NzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAuLi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2Jhc2UuY3NzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAuLi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2ZvdW5kYXRpb24uY3NzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAuLi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2Jhci10b3AucG5nCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuIERveHlnZW4KKyMgd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGUgc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIGFjY29yZGluZyB0bworIyB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwgc2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlCisjIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMAorIyBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzNTksIGRlZmF1bHQgdmFsdWU6IDIyMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX1NBVCB0YWcgY29udHJvbHMgdGhlIHB1cml0eSAob3Igc2F0dXJhdGlvbikgb2YgdGhlIGNvbG9ycworIyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBhIHZhbHVlIG9mIDAgdGhlIG91dHB1dCB3aWxsIHVzZSBncmF5c2NhbGVzIG9ubHkuIEEKKyMgdmFsdWUgb2YgMjU1IHdpbGwgcHJvZHVjZSB0aGUgbW9zdCB2aXZpZCBjb2xvcnMuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDI1NSwgZGVmYXVsdCB2YWx1ZTogMTAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfU0FUICAgID0gMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gdGhlCisjIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdyAxMDAKKyMgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZSB0aGUgb3V0cHV0CisjIGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwgc28gODAgcmVwcmVzZW50cworIyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLCBhbmQgMTAwIGRvZXMgbm90CisjIGNoYW5nZSB0aGUgZ2FtbWEuCisjIE1pbmltdW0gdmFsdWU6IDQwLCBtYXhpbXVtIHZhbHVlOiAyNDAsIGRlZmF1bHQgdmFsdWU6IDgwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gOTEKKworIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gWUVTIGNhbiBoZWxwIHRvIHNob3cgd2hlbiBkb3h5Z2VuIHdhcyBsYXN0IHJ1biBhbmQgdGh1cyBpZiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBpcyB1cCB0byBkYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfVElNRVNUQU1QICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCisjIHBhZ2UgaGFzIGxvYWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gWUVTCisKKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZiBlbnRyaWVzCisjIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXIgY2FuIGV4cGFuZAorIyBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZCB0aGUgdHJlZSB0bworIyBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlIHZpc2libGUgKHVubGVzcworIyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZgorIyBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieSBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZQorIyByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZAorIyB0cmVlIGJ5IGRlZmF1bHQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDk5OTksIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMAorCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQKKyMgZW52aXJvbm1lbnQgKHNlZTogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMveGNvZGUvKSwgaW50cm9kdWNlZCB3aXRoCisjIE9TWCAxMC41IChMZW9wYXJkKS4gVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIE1ha2VmaWxlIGluIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbgorIyB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZyBtYWtlIGluc3RhbGwgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIGl0IGF0CisjIHN0YXJ0dXAuIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sCisjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTworCisjIFRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRvY3NldCBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcworIyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZSBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlcgorIyAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgY2FuIGJlIGdyb3VwZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKKworIyBUaGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24KKyMgc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLgorIyBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeQorIyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZQorIyBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC5kb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfSUQgICAgPSBvcmcuZG94eWdlbi5QdWJsaXNoZXIKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9OQU1FIHRhZyBpZGVudGlmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiBnZW5lcmF0ZXMgdGhyZWUKKyMgYWRkaXRpb25hbCBIVE1MIGluZGV4IGZpbGVzOiBpbmRleC5oaHAsIGluZGV4LmhoYywgYW5kIGluZGV4Lmhoay4gVGhlCisjIGluZGV4LmhocCBpcyBhIHByb2plY3QgZmlsZSB0aGF0IGNhbiBiZSByZWFkIGJ5IE1pY3Jvc29mdCdzIEhUTUwgSGVscCBXb3Jrc2hvcAorIyAoc2VlOiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTIxMTM4KSBvbgorIyBXaW5kb3dzLgorIworIyBUaGUgSFRNTCBIZWxwIFdvcmtzaG9wIGNvbnRhaW5zIGEgY29tcGlsZXIgdGhhdCBjYW4gY29udmVydCBhbGwgSFRNTCBvdXRwdXQKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaW50byBhIHNpbmdsZSBjb21waWxlZCBIVE1MIGZpbGUgKC5jaG0pLiBDb21waWxlZCBIVE1MCisjIGZpbGVzIGFyZSBub3cgdXNlZCBhcyB0aGUgV2luZG93cyA5OCBoZWxwIGZvcm1hdCwgYW5kIHdpbGwgcmVwbGFjZSB0aGUgb2xkCisjIFdpbmRvd3MgaGVscCBmb3JtYXQgKC5obHApIG9uIGFsbCBXaW5kb3dzIHBsYXRmb3JtcyBpbiB0aGUgZnV0dXJlLiBDb21wcmVzc2VkCisjIEhUTUwgZmlsZXMgYWxzbyBjb250YWluIGFuIGluZGV4LCBhIHRhYmxlIG9mIGNvbnRlbnRzLCBhbmQgeW91IGNhbiBzZWFyY2ggZm9yCisjIHdvcmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgSFRNTCB3b3Jrc2hvcCBhbHNvIGNvbnRhaW5zIGEgdmlld2VyIGZvcgorIyBjb21wcmVzc2VkIEhUTUwgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgVGhlIENITV9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htCisjIGZpbGUuIFlvdSBjYW4gYWRkIGEgcGF0aCBpbiBmcm9udCBvZiB0aGUgZmlsZSBpZiB0aGUgcmVzdWx0IHNob3VsZCBub3QgYmUKKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0ZJTEUgICAgICAgICAgICAgICA9CisKKyMgVGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGgKKyMgaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSwKKyMgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKyMgVGhlIGZpbGUgaGFzIHRvIGJlIHNwZWNpZmllZCB3aXRoIGZ1bGwgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPQorCisjIFRoZSBHRU5FUkFURV9DSEkgZmxhZyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQKKyMgKFlFUykgb3IgdGhhdCBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hc3RlciAuY2htIGZpbGUgKE5PKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PCisKKyMgVGhlIENITV9JTkRFWF9FTkNPRElORyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoaGhrKSwgY29udGVudCAoaGhjKQorIyBhbmQgcHJvamVjdCBmaWxlIGNvbnRlbnQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitDSE1fSU5ERVhfRU5DT0RJTkcgICAgID0KKworIyBUaGUgQklOQVJZX1RPQyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkCisjIChZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4gRnVydGhlcm1vcmUgaXQKKyMgZW5hYmxlcyB0aGUgUHJldmlvdXMgYW5kIE5leHQgYnV0dG9ucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgdG8KKyMgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIG9mIHRoZSBIVE1MIGhlbHAgZG9jdW1lbnRhdGlvbiBhbmQgdG8gdGhlIHRyZWUgdmlldy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgYm90aCBRSFBfTkFNRVNQQUNFIGFuZAorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQKKyMgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIFF0J3MgcWhlbHBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgYSBRdCBDb21wcmVzc2VkIEhlbHAKKyMgKC5xY2gpIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1FIUCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBRSEdfTE9DQVRJT04gdGFnIGlzIHNwZWNpZmllZCwgdGhlIFFDSF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisjIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAucWNoIGZpbGUuIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0bworIyB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FDSF9GSUxFICAgICAgICAgICAgICAgPQorCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0IEhlbHAKKyMgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gTmFtZXNwYWNlCisjIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBRSFBfVklSVFVBTF9GT0xERVIgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQKKyMgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBWaXJ0dWFsCisjIEZvbGRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI3ZpcnR1YWwtCisjIGZvbGRlcnMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogZG9jLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiB0aGUgUUhQX0NVU1RfRklMVEVSX05BTUUgdGFnIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tCisjIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9CisKKyMgVGhlIFFIUF9DVVNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQorIyBjdXN0b20gZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KKyMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQorIyBmaWx0ZXJzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0KKworIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcworIyBwcm9qZWN0J3MgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4gUXQgSGVscCBQcm9qZWN0IC8gRmlsdGVyIEF0dHJpYnV0ZXMgKHNlZToKKyMgaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2ZpbHRlci1hdHRyaWJ1dGVzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfU0VDVF9GSUxURVJfQVRUUlMgID0KKworIyBUaGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzCisjIHFoZWxwZ2VuZXJhdG9yLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gcWhlbHBnZW5lcmF0b3Igb24gdGhlCisjIGdlbmVyYXRlZCAucWhwIGZpbGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9CisKKyMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCB0aGV5IGZvcm0gYW4gRWNsaXBzZSBoZWxwIHBsdWdpbi4gVG8KKyMgaW5zdGFsbCB0aGlzIHBsdWdpbiBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdW5kZXIgdGhlIGhlbHAgY29udGVudHMgbWVudSBpbgorIyBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgbmVlZHMKKyMgdG8gYmUgY29waWVkIGludG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IG9mIGVjbGlwc2UuIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKKyMgd2l0aGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLgorIyBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZSB0aGUgaGVscCBhcHBlYXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0VDTElQU0VIRUxQICAgPSBOTworCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBFY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbgorIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUgdGhpcworIyBuYW1lLiBFYWNoIGRvY3VtZW50YXRpb24gc2V0IHNob3VsZCBoYXZlIGl0cyBvd24gaWRlbnRpZmllci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9FQ0xJUFNFSEVMUCBpcyBzZXQgdG8gWUVTLgorCitFQ0xJUFNFX0RPQ19JRCAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIElmIHlvdSB3YW50IGZ1bGwgY29udHJvbCBvdmVyIHRoZSBsYXlvdXQgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIHBhZ2VzIGl0IG1pZ2h0CisjIGJlIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHRoZSBpbmRleCBhbmQgcmVwbGFjZSBpdCB3aXRoIHlvdXIgb3duLiBUaGUKKyMgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCAodGFicykgYXQgdG9wCisjIG9mIGVhY2ggSFRNTCBwYWdlLiBBIHZhbHVlIG9mIE5PIGVuYWJsZXMgdGhlIGluZGV4IGFuZCB0aGUgdmFsdWUgWUVTIGRpc2FibGVzCisjIGl0LiBTaW5jZSB0aGUgdGFicyBpbiB0aGUgaW5kZXggY29udGFpbiB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgbmF2aWdhdGlvbgorIyB0cmVlLCB5b3UgY2FuIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgaWYgeW91IGFsc28gc2V0IEdFTkVSQVRFX1RSRUVWSUVXIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4CisjIHN0cnVjdHVyZSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGluZm9ybWF0aW9uLiBJZiB0aGUgdGFnCisjIHZhbHVlIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZCBjb250YWluaW5nIGEgdHJlZS1saWtlCisjIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdCBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzCisjIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkCisjIChpLmUuIGFueSBtb2Rlcm4gYnJvd3NlcikuIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlCisjIEhUTUwgaGVscCBmZWF0dXJlLiBWaWEgY3VzdG9tIHN0eWxlIHNoZWV0cyAoc2VlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCkgb25lIGNhbgorIyBmdXJ0aGVyIGZpbmUtdHVuZSB0aGUgbG9vayBvZiB0aGUgaW5kZXguIEFzIGFuIGV4YW1wbGUsIHRoZSBkZWZhdWx0IHN0eWxlCisjIHNoZWV0IGdlbmVyYXRlZCBieSBkb3h5Z2VuIGhhcyBhbiBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIHB1dCBhbiBpbWFnZSBhdAorIyB0aGUgcm9vdCBvZiB0aGUgdHJlZSBpbnN0ZWFkIG9mIHRoZSBQUk9KRUNUX05BTUUuIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMKKyMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCwgeW91IGNvdWxkIGNvbnNpZGVyIHNldHRpbmcKKyMgRElTQUJMRV9JTkRFWCB0byBZRVMgd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gWUVTCisKKyMgVGhlIEVOVU1fVkFMVUVTX1BFUl9MSU5FIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBlbnVtIHZhbHVlcyB0aGF0CisjIGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IGEgdmFsdWUgb2YgMCB3aWxsIGNvbXBsZXRlbHkgc3VwcHJlc3MgdGhlIGVudW0gdmFsdWVzIGZyb20gYXBwZWFyaW5nCisjIGluIHRoZSBvdmVydmlldyBzZWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyMCwgZGVmYXVsdCB2YWx1ZTogNC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDEKKworIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZSB1c2VkCisjIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUgaXMgc2hvd24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDE1MDAsIGRlZmF1bHQgdmFsdWU6IDI1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorCisjIElmIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgb3BlbiBsaW5rcyB0bworIyBleHRlcm5hbCBzeW1ib2xzIGltcG9ydGVkIHZpYSB0YWcgZmlsZXMgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PCisKKyMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhVGVYIGZvcm11bGFzIGluY2x1ZGVkIGFzIGltYWdlcyBpbgorIyB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBXaGVuIHlvdSBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBhZnRlciBhIHN1Y2Nlc3NmdWwKKyMgZG94eWdlbiBydW4geW91IG5lZWQgdG8gbWFudWFsbHkgcmVtb3ZlIGFueSBmb3JtXyoucG5nIGltYWdlcyBmcm9tIHRoZSBIVE1MCisjIG91dHB1dCBkaXJlY3RvcnkgdG8gZm9yY2UgdGhlbSB0byBiZSByZWdlbmVyYXRlZC4KKyMgTWluaW11bSB2YWx1ZTogOCwgbWF4aW11bSB2YWx1ZTogNTAsIGRlZmF1bHQgdmFsdWU6IDEwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKKworIyBVc2UgdGhlIEZPUk1VTEFfVFJBTlBBUkVOVCB0YWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUgbm90CisjIHN1cHBvcnRlZCBwcm9wZXJseSBmb3IgSUUgNi4wLCBidXQgYXJlIHN1cHBvcnRlZCBvbiBhbGwgbW9kZXJuIGJyb3dzZXJzLgorIworIyBOb3RlIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGlzIG9wdGlvbiB5b3UgbmVlZCB0byBkZWxldGUgYW55IGZvcm1fKi5wbmcgZmlsZXMgaW4KKyMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSBiZWZvcmUgdGhlIGNoYW5nZXMgaGF2ZSBlZmZlY3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0ZPUk1VTEFfVFJBTlNQQVJFTlQgICAgPSBZRVMKKworIyBFbmFibGUgdGhlIFVTRV9NQVRISkFYIG9wdGlvbiB0byByZW5kZXIgTGFUZVggZm9ybXVsYXMgdXNpbmcgTWF0aEpheCAoc2VlCisjIGh0dHA6Ly93d3cubWF0aGpheC5vcmcpIHdoaWNoIHVzZXMgY2xpZW50IHNpZGUgSmF2YXNjcmlwdCBmb3IgdGhlIHJlbmRlcmluZworIyBpbnN0ZWFkIG9mIHVzaW5nIHByZS1yZW5kZXJlZCBiaXRtYXBzLiBVc2UgdGhpcyBpZiB5b3UgZG8gbm90IGhhdmUgTGFUZVgKKyMgaW5zdGFsbGVkIG9yIGlmIHlvdSB3YW50IHRvIGZvcm11bGFzIGxvb2sgcHJldHRpZXIgaW4gdGhlIEhUTUwgb3V0cHV0LiBXaGVuCisjIGVuYWJsZWQgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5zdGFsbCBNYXRoSmF4IHNlcGFyYXRlbHkgYW5kIGNvbmZpZ3VyZSB0aGUgcGF0aAorIyB0byBpdCB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitVU0VfTUFUSEpBWCAgICAgICAgICAgID0gTk8KKworIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgY2FuIHNldCB0aGUgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRvIGJlIHVzZWQgZm9yCisjIHRoZSBNYXRoSmF4IG91dHB1dC4gU2VlIHRoZSBNYXRoSmF4IHNpdGUgKHNlZToKKyMgaHR0cDovL2RvY3MubWF0aGpheC5vcmcvZW4vbGF0ZXN0L291dHB1dC5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBIVE1MLUNTUyAod2hpY2ggaXMgc2xvd2VyLCBidXQgaGFzIHRoZSBiZXN0CisjIGNvbXBhdGliaWxpdHkpLCBOYXRpdmVNTUwgKGkuZS4gTWF0aE1MKSBhbmQgU1ZHLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSFRNTC1DU1MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0ZPUk1BVCAgICAgICAgID0gSFRNTC1DU1MKKworIyBXaGVuIE1hdGhKYXggaXMgZW5hYmxlZCB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLiBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CisjIHNob3VsZCBjb250YWluIHRoZSBNYXRoSmF4LmpzIHNjcmlwdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbWF0aGpheCBkaXJlY3RvcnkKKyMgaXMgbG9jYXRlZCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LCB0aGVuCisjIE1BVEhKQVhfUkVMUEFUSCBzaG91bGQgYmUgLi4vbWF0aGpheC4gVGhlIGRlZmF1bHQgdmFsdWUgcG9pbnRzIHRvIHRoZSBNYXRoSmF4CisjIENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayBzbyB5b3UgY2FuIHF1aWNrbHkgc2VlIHRoZSByZXN1bHQgd2l0aG91dCBpbnN0YWxsaW5nCisjIE1hdGhKYXguIEhvd2V2ZXIsIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYSBsb2NhbCBjb3B5IG9mCisjIE1hdGhKYXggZnJvbSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnIGJlZm9yZSBkZXBsb3ltZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0CisKKyMgVGhlIE1BVEhKQVhfRVhURU5TSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBNYXRoSmF4CisjIGV4dGVuc2lvbiBuYW1lcyB0aGF0IHNob3VsZCBiZSBlbmFibGVkIGR1cmluZyBNYXRoSmF4IHJlbmRlcmluZy4gRm9yIGV4YW1wbGUKKyMgTUFUSEpBWF9FWFRFTlNJT05TID0gVGVYL0FNU21hdGggVGVYL0FNU3N5bWJvbHMKKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfRVhURU5TSU9OUyAgICAgPQorCisjIFRoZSBNQVRISkFYX0NPREVGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB3aXRoIGphdmFzY3JpcHQgcGllY2VzCisjIG9mIGNvZGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gc3RhcnR1cCBvZiB0aGUgTWF0aEpheCBjb2RlLiBTZWUgdGhlIE1hdGhKYXggc2l0ZQorIyAoc2VlOiBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuIEZvciBhbgorIyBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfQ09ERUZJTEUgICAgICAgPQorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvcgorIyB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0IGFuZCBESFRNTCBhbmQKKyMgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAKKyMgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cyAoR0VORVJBVEVfRE9DU0VUKQorIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuCisjIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIGNhbiBiZSBzbG93LCB0aGVuCisjIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvCisjIHNlYXJjaCB1c2luZyB0aGUga2V5Ym9hcmQ7IHRvIGp1bXAgdG8gdGhlIHNlYXJjaCBib3ggdXNlIDxhY2Nlc3Mga2V5PiArIFMKKyMgKHdoYXQgdGhlIDxhY2Nlc3Mga2V5PiBpcyBkZXBlbmRzIG9uIHRoZSBPUyBhbmQgYnJvd3NlciwgYnV0IGl0IGlzIHR5cGljYWxseQorIyA8Q1RSTD4sIDxBTFQ+LzxvcHRpb24+LCBvciBib3RoKS4gSW5zaWRlIHRoZSBzZWFyY2ggYm94IHVzZSB0aGUgPGN1cnNvciBkb3duCisjIGtleT4gdG8ganVtcCBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cyB3aW5kb3csIHRoZSByZXN1bHRzIGNhbiBiZSBuYXZpZ2F0ZWQKKyMgdXNpbmcgdGhlIDxjdXJzb3Iga2V5cz4uIFByZXNzIDxFbnRlcj4gdG8gc2VsZWN0IGFuIGl0ZW0gb3IgPGVzY2FwZT4gdG8gY2FuY2VsCisjIHRoZSBzZWFyY2guIFRoZSBmaWx0ZXIgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUKKyMgc2VhcmNoIGJveCBieSBwcmVzc2luZyA8U2hpZnQ+KzxjdXJzb3IgZG93bj4uIEFsc28gaGVyZSB1c2UgdGhlIDxjdXJzb3Iga2V5cz4KKyMgdG8gc2VsZWN0IGEgZmlsdGVyIGFuZCA8RW50ZXI+IG9yIDxlc2NhcGU+IHRvIGFjdGl2YXRlIG9yIGNhbmNlbCB0aGUgZmlsdGVyCisjIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhIHdlYiBjbGllbnQgdXNpbmcgSmF2YXNjcmlwdC4gVGhlcmUKKyMgYXJlIHR3byBmbGF2b3JzIG9mIHdlYiBzZXJ2ZXIgYmFzZWQgc2VhcmNoaW5nIGRlcGVuZGluZyBvbiB0aGUgRVhURVJOQUxfU0VBUkNICisjIHNldHRpbmcuIFdoZW4gZGlzYWJsZWQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBIUCBzY3JpcHQgZm9yIHNlYXJjaGluZyBhbmQKKyMgYW4gaW5kZXggZmlsZSB1c2VkIGJ5IHRoZSBzY3JpcHQuIFdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQgdGhlIGluZGV4aW5nCisjIGFuZCBzZWFyY2hpbmcgbmVlZHMgdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgdG9vbHMuIFNlZSB0aGUgc2VjdGlvbgorIyAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8KKworIyBXaGVuIEVYVEVSTkFMX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgbm8gbG9uZ2VyIGdlbmVyYXRlIHRoZSBQSFAKKyMgc2NyaXB0IGZvciBzZWFyY2hpbmcuIEluc3RlYWQgdGhlIHNlYXJjaCByZXN1bHRzIGFyZSB3cml0dGVuIHRvIGFuIFhNTCBmaWxlCisjIHdoaWNoIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBhbiBleHRlcm5hbCBpbmRleGVyLiBEb3h5Z2VuIHdpbGwgaW52b2tlIGFuCisjIGV4dGVybmFsIHNlYXJjaCBlbmdpbmUgcG9pbnRlZCB0byBieSB0aGUgU0VBUkNIRU5HSU5FX1VSTCBvcHRpb24gdG8gb2J0YWluIHRoZQorIyBzZWFyY2ggcmVzdWx0cy4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCisjIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKKyMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuCisjCisjIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0ggICAgICAgID0gTk8KKworIyBUaGUgU0VBUkNIRU5HSU5FX1VSTCBzaG91bGQgcG9pbnQgdG8gYSBzZWFyY2ggZW5naW5lIGhvc3RlZCBieSBhIHdlYiBzZXJ2ZXIKKyMgd2hpY2ggd2lsbCByZXR1cm4gdGhlIHNlYXJjaCByZXN1bHRzIHdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLiBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZAorIyBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORV9VUkwgICAgICAgPQorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlIHVuaW5kZXhlZAorIyBzZWFyY2ggZGF0YSBpcyB3cml0dGVuIHRvIGEgZmlsZSBmb3IgaW5kZXhpbmcgYnkgYW4gZXh0ZXJuYWwgdG9vbC4gV2l0aCB0aGUKKyMgU0VBUkNIREFUQV9GSUxFIHRhZyB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgY2FuIGJlIHNwZWNpZmllZC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogc2VhcmNoZGF0YS54bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIREFUQV9GSUxFICAgICAgICA9IHNlYXJjaGRhdGEueG1sCisKKyMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUKKyMgRVhURVJOQUxfU0VBUkNIX0lEIHRhZyBjYW4gYmUgdXNlZCBhcyBhbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvamVjdC4gVGhpcyBpcworIyB1c2VmdWwgaW4gY29tYmluYXRpb24gd2l0aCBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgdG8gc2VhcmNoIHRocm91Z2ggbXVsdGlwbGUKKyMgcHJvamVjdHMgYW5kIHJlZGlyZWN0IHRoZSByZXN1bHRzIGJhY2sgdG8gdGhlIHJpZ2h0IHByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhURVJOQUxfU0VBUkNIX0lEICAgICA9CisKKyMgVGhlIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHNlYXJjaGluZyB0aHJvdWdoIGRveHlnZW4KKyMgcHJvamVjdHMgb3RoZXIgdGhhbiB0aGUgb25lIGRlZmluZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIGJ1dCB0aGF0IGFyZQorIyBhbGwgYWRkZWQgdG8gdGhlIHNhbWUgZXh0ZXJuYWwgc2VhcmNoIGluZGV4LiBFYWNoIHByb2plY3QgbmVlZHMgdG8gaGF2ZSBhCisjIHVuaXF1ZSBpZCBzZXQgdmlhIEVYVEVSTkFMX1NFQVJDSF9JRC4gVGhlIHNlYXJjaCBtYXBwaW5nIHRoZW4gbWFwcyB0aGUgaWQgb2YKKyMgdG8gYSByZWxhdGl2ZSBsb2NhdGlvbiB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQuIFRoZSBmb3JtYXQgaXM6CisjIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyA9IHRhZ25hbWUxPWxvYzEgdGFnbmFtZTI9bG9jMiAuLi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9TRUFSQ0hfTUFQUElOR1MgID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgTGFUZVggb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKKyMgaW52b2tlZC4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGluZworIyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlIE1ha2VmaWxlIHRoYXQgaXMKKyMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8gZ2VuZXJhdGUKKyMgaW5kZXggZm9yIExhVGVYLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBtYWtlaW5kZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBMYVRlWAorIyBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIHNhdmUgc29tZQorIyB0cmVlcyBpbiBnZW5lcmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZCBieSB0aGUKKyMgcHJpbnRlci4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogYTQgKDIxMCB4IDI5NyBtbSksIGxldHRlciAoOC41IHggMTEgaW5jaGVzKSwgbGVnYWwgKDguNSB4CisjIDE0IGluY2hlcykgYW5kIGV4ZWN1dGl2ZSAoNy4yNSB4IDEwLjUgaW5jaGVzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGE0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0CisKKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIExhVGVYIHBhY2thZ2UgbmFtZXMKKyMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4gVGhlIHBhY2thZ2UgY2FuIGJlIHNwZWNpZmllZCBqdXN0CisjIGJ5IGl0cyBuYW1lIG9yIHdpdGggdGhlIGNvcnJlY3Qgc3ludGF4IGFzIHRvIGJlIHVzZWQgd2l0aCB0aGUgTGFUZVgKKyMgXHVzZXBhY2thZ2UgY29tbWFuZC4gVG8gZ2V0IHRoZSB0aW1lcyBmb250IGZvciBpbnN0YW5jZSB5b3UgY2FuIHNwZWNpZnkgOgorIyBFWFRSQV9QQUNLQUdFUz10aW1lcyBvciBFWFRSQV9QQUNLQUdFUz17dGltZXN9CisjIFRvIHVzZSB0aGUgb3B0aW9uIGludGxpbWl0cyB3aXRoIHRoZSBhbXNtYXRoIHBhY2thZ2UgeW91IGNhbiBzcGVjaWZ5OgorIyBFWFRSQV9QQUNLQUdFUz1baW50bGltaXRzXXthbXNtYXRofQorIyBJZiBsZWZ0IGJsYW5rIG5vIGV4dHJhIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0KKworIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvciB0aGUKKyMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIGZpcnN0CisjIGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQgaGVhZGVyLiBTZWUKKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBsZXQgZG94eWdlbiB3cml0ZSB0aGUKKyMgZGVmYXVsdCBoZWFkZXIgdG8gYSBzZXBhcmF0ZSBmaWxlLgorIworIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBoZWFkZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISBUaGUKKyMgZm9sbG93aW5nIGNvbW1hbmRzIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcgaW5zaWRlIHRoZSBoZWFkZXI6ICR0aXRsZSwKKyMgJGRhdGV0aW1lLCAkZGF0ZSwgJGRveHlnZW52ZXJzaW9uLCAkcHJvamVjdG5hbWUsICRwcm9qZWN0bnVtYmVyLAorIyAkcHJvamVjdGJyaWVmLCAkcHJvamVjdGxvZ28uIERveHlnZW4gd2lsbCByZXBsYWNlICR0aXRsZSB3aXRoIHRoZSBlbXB0eQorIyBzdHJpbmcsIGZvciB0aGUgcmVwbGFjZW1lbnQgdmFsdWVzIG9mIHRoZSBvdGhlciBjb21tYW5kcyB0aGUgdXNlciBpcyByZWZlcnJlZAorIyB0byBIVE1MX0hFQURFUi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPQorCisjIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGZvb3Rlci4gU2VlCisjIExBVEVYX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGZvb3RlciBhbmQgd2hhdAorIyBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLgorIworIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBmb290ZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRk9PVEVSICAgICAgICAgICA9CisKKyMgVGhlIExBVEVYX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKKyMgTGFUZVggc3R5bGUgc2hlZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldHMgY3JlYXRlZAorIyBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4gRG94eWdlbgorIyB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIGV4dHJhIHN0eWxlIHNoZWV0IGZpbGVzIGlzIG9mIGltcG9ydGFuY2UgKGUuZy4gdGhlIGxhc3QKKyMgc3R5bGUgc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQorIyBsaXN0KS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX1NUWUxFU0hFRVQgPQorCisjIFRoZSBMQVRFWF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIExBVEVYX09VVFBVVCBvdXRwdXQKKyMgZGlyZWN0b3J5LiBOb3RlIHRoYXQgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IKKyMgbWFya2VycyBhdmFpbGFibGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9FWFRSQV9GSUxFUyAgICAgID0KKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcworIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCisjIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHVzZSBwZGZsYXRleCB0byBnZW5lcmF0ZQorIyB0aGUgUERGIGZpbGUgZGlyZWN0bHkgZnJvbSB0aGUgTGFUZVggZmlsZXMuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMsIHRvIGdldCBhCisjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxiYXRjaG1vZGUKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCBydW5uaW5nCisjIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZAorIyB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX0hJREVfSU5ESUNFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgaW5jbHVkZSB0aGUKKyMgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pIGluIHRoZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZQorIyBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTworCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBTZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggYW5kIFxjaXRlIGZvciBtb3JlIGluZm8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbGFpbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbgorCisjIElmIHRoZSBMQVRFWF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfVElNRVNUQU1QICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dC4gVGhlCisjIFJURiBvdXRwdXQgaXMgb3B0aW1pemVkIGZvciBXb3JkIDk3IGFuZCBtYXkgbm90IGxvb2sgdG9vIHByZXR0eSB3aXRoIG90aGVyIFJURgorIyByZWFkZXJzL2VkaXRvcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PCisKKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHJ0Zi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCisKKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBSVEYgZG9jdW1lbnQuIFN5bnRheCBpcworIyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4gQSB0ZW1wbGF0ZSBleHRlbnNpb25zIGZpbGUgY2FuIGJlIGdlbmVyYXRlZAorIyB1c2luZyBkb3h5Z2VuIC1lIHJ0ZiBleHRlbnNpb25GaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPQorCisjIElmIHRoZSBSVEZfU09VUkNFX0NPREUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBzb3VyY2UgY29kZQorIyB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIFJURiBvdXRwdXQuCisjCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3Mgc3VjaCBhcworIyBTT1VSQ0VfQlJPV1NFUi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TT1VSQ0VfQ09ERSAgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTUFOIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbWFuIHBhZ2VzIGZvcgorIyBjbGFzc2VzIGFuZCBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8KKworIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LiBBIGRpcmVjdG9yeSBtYW4zIHdpbGwgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkKKyMgTUFOX09VVFBVVC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBtYW4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkCisjIG1hbiBwYWdlcy4gSW4gY2FzZSB0aGUgbWFudWFsIHNlY3Rpb24gZG9lcyBub3Qgc3RhcnQgd2l0aCBhIG51bWJlciwgdGhlIG51bWJlcgorIyAzIGlzIHByZXBlbmRlZC4gVGhlIGRvdCAoLikgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFOX0VYVEVOU0lPTiB0YWcgaXMKKyMgb3B0aW9uYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuMy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBUaGUgTUFOX1NVQkRJUiB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNyZWF0ZWQgd2l0aGluCisjIE1BTl9PVVRQVVQgaW4gd2hpY2ggdGhlIG1hbiBwYWdlcyBhcmUgcGxhY2VkLiBJZiBkZWZhdWx0cyB0byBtYW4gZm9sbG93ZWQgYnkKKyMgTUFOX0VYVEVOU0lPTiB3aXRoIHRoZSBpbml0aWFsIC4gcmVtb3ZlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fU1VCRElSICAgICAgICAgICAgID0KKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBkb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCB0aGVuIGl0CisjIHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwKKyMgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0CisjIHRoZW0gdGhlIG1hbiBjb21tYW5kIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0CisjIGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogeG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZHVtcCB0aGUgcHJvZ3JhbQorIyBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0bworIyB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplCisjIG9mIHRoZSBYTUwgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgRE9DQk9PSyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfRE9DQk9PSyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCisKKyMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCisjIGZyb250IG9mIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCisKKyMgSWYgdGhlIERPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBpbmNsdWRlIHRoZQorIyBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcKKyMgaW5mb3JtYXRpb24pIHRvIHRoZSBET0NCT09LIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5CisjIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBET0NCT09LIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DQk9PSyBpcyBzZXQgdG8gWUVTLgorCitET0NCT09LX1BST0dSQU1MSVNUSU5HID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuCisjIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBodHRwOi8vYXV0b2dlbi5zZi5uZXQpIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUKKyMgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcworIyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlCisjIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKKyMgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJCisjIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5CisjIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8sIHRoZQorIyBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdAorIyBqdXN0IHRoZSBzYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUgYXJlCisjIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4gVGhpcyBpcyB1c2VmdWwKKyMgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lIE1ha2VmaWxlIGRvbid0CisjIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZXZhbHVhdGUgYWxsCisjIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyBuYW1lcworIyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTywgb25seSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB3aWxsIGJlCisjIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZCB3YXkgYnkgc2V0dGluZworIyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSBQUkVERUZJTkVEIGFuZAorIyBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gTk8KKworIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgaW5jbHVkZSBmaWxlcyBpbiB0aGUKKyMgSU5DTFVERV9QQVRIIHdpbGwgYmUgc2VhcmNoZWQgaWYgYSAjaW5jbHVkZSBpcyBmb3VuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKKworIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieSB0aGUKKyMgcHJlcHJvY2Vzc29yLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIX0lOQ0xVREVTIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPQorCisjIFlvdSBjYW4gdXNlIHRoZSBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQKKyMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZQorIyBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuaywgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCB3aXRoIEZJTEVfUEFUVEVSTlMgd2lsbCBiZQorIyB1c2VkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9CisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKKyMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCisjIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKKyMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgorIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gRE9YWUdFTiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgUFNZTkNfUFVCTElDX1dJVEhfVEVTVFNfRUxTRV9QUklWQVRFPXByaXZhdGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIE5ETl9DWFhfREVDTEFSRV9XSVJFX0VOQ09ERV9JTlNUQU5USUFUSU9OUyh4KT0KKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIHRoaXMKKyMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLiBUaGUKKyMgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4gVXNlIHRoZSBQUkVERUZJTkVECisjIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IG92ZXJydWxlcyB0aGUKKyMgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0KKworIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwKKyMgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZQorIyBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggZnVuY3Rpb24gbWFjcm9zCisjIGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgYm9pbGVyLXBsYXRlIGNvZGUsIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QKKyMgcmVtb3ZlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZyBmaWxlcy4gRm9yIGVhY2ggdGFnCisjIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlIGZvcm1hdCBvZgorIyBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLgorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uCisjIHdoZXJlIGxvYzEgYW5kIGxvYzIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIFVSTHMuIFNlZSB0aGUKKyMgc2VjdGlvbiAiTGlua2luZyB0byBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlCisjIG9mIHRhZyBmaWxlcy4KKyMgTm90ZTogRWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQorIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPQorCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUgYQorIyB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4gU2VlIHNlY3Rpb24gIkxpbmtpbmcgdG8KKyMgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzYWdlIG9mIHRhZyBmaWxlcy4KKworR0VORVJBVEVfVEFHRklMRSAgICAgICA9IFBTeW5jLnRhZworCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBjbGFzcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhURVJOQUxfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBwYWdlcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgcmVsYXRlZCBwYWdlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBwYWdlcyB3aWxsCisjIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfUEFHRVMgICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mICd3aGljaCBwZXJsJykuCisjIFRoZSBkZWZhdWx0IGZpbGUgKHdpdGggYWJzb2x1dGUgcGF0aCkgaXM6IC91c3IvYmluL3BlcmwuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjbGFzcyBkaWFncmFtCisjIChpbiBIVE1MIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0bworIyBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UCisjIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKKyMgcG93ZXJmdWwgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlOgorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK01TQ0dFTl9QQVRIICAgICAgICAgICAgPQorCisjIFlvdSBjYW4gaW5jbHVkZSBkaWFncmFtcyBtYWRlIHdpdGggZGlhIGluIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gRG94eWdlbiB3aWxsCisjIHRoZW4gcnVuIGRpYSB0byBwcm9kdWNlIHRoZSBkaWFncmFtIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZQorIyBESUFfUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpYSBiaW5hcnkgcmVzaWRlcy4KKyMgSWYgbGVmdCBlbXB0eSBkaWEgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aC4KKworRElBX1BBVEggICAgICAgICAgICAgICA9CisKKyMgSWYgc2V0IHRvIFlFUyB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZSBpbmhlcml0YW5jZQorIyBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkIG9yIGlzIG5vdCBhIGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pLCBhIGdyYXBoIHZpc3VhbGl6YXRpb24gdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudAorIyBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcworIyBzZXQgdG8gTk8KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSEFWRV9ET1QgICAgICAgICAgICAgICA9IFlFUworCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgYWxsb3dlZAorIyB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgZG94eWdlbiB3aWxsIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mCisjIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0IGV4cGxpY2l0bHkgdG8gYSB2YWx1ZQorIyBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZworIyBzcGVlZC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzIsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAorCisjIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgaW4gdGhlIGRvdCBmaWxlcyB0aGF0IGRveHlnZW4KKyMgZ2VuZXJhdGVzIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZQorIyBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYQorIyBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieQorIyBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIZWx2ZXRpY2EuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gSGVsdmV0aWNhCisKKyMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIChpbiBwb2ludHMpIG9mIHRoZSBmb250IG9mCisjIGRvdCBncmFwaHMuCisjIE1pbmltdW0gdmFsdWU6IDQsIG1heGltdW0gdmFsdWU6IDI0LCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAorCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgZGVmYXVsdCBmb250IGFzIHNwZWNpZmllZCB3aXRoCisjIERPVF9GT05UTkFNRS4gSWYgeW91IHNwZWNpZnkgYSBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQKKyMgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9CisKKyMgSWYgdGhlIENMQVNTX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCisjIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4KKyMgU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDT0xMQUJPUkFUSU9OX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGltcGxlbWVudGF0aW9uCisjIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQgY2xhc3MgcmVmZXJlbmNlcyB2YXJpYWJsZXMpIG9mIHRoZQorIyBjbGFzcyB3aXRoIG90aGVyIGRvY3VtZW50ZWQgY2xhc3Nlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCisjIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nCisjIExhbmd1YWdlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitVTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZSB0aGUKKyMgY2xhc3Mgbm9kZS4gSWYgdGhlcmUgYXJlIG1hbnkgZmllbGRzIG9yIG1ldGhvZHMgYW5kIG1hbnkgbm9kZXMgdGhlIGdyYXBoIG1heQorIyBiZWNvbWUgdG9vIGJpZyB0byBiZSB1c2VmdWwuIFRoZSBVTUxfTElNSVRfTlVNX0ZJRUxEUyB0aHJlc2hvbGQgbGltaXRzIHRoZQorIyBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUgbWFuYWdlYWJsZS4gU2V0IHRoaXMgdG8gMAorIyBmb3Igbm8gbGltaXQuIE5vdGUgdGhhdCB0aGUgdGhyZXNob2xkIG1heSBiZSBleGNlZWRlZCBieSA1MCUgYmVmb3JlIHRoZSBsaW1pdAorIyBpcyBlbmZvcmNlZC4gU28gd2hlbiB5b3Ugc2V0IHRoZSB0aHJlc2hvbGQgdG8gMTAsIHVwIHRvIDE1IGZpZWxkcyBtYXkgYXBwZWFyLAorIyBidXQgaWYgdGhlIG51bWJlciBleGNlZWRzIDE1LCB0aGUgdG90YWwgYW1vdW50IG9mIGZpZWxkcyBzaG93biBpcyBsaW1pdGVkIHRvCisjIDEwLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAsIGRlZmF1bHQgdmFsdWU6IDEwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVU1MX0xJTUlUX05VTV9GSUVMRFMgICA9IDEwCisKKyMgSWYgdGhlIFRFTVBMQVRFX1JFTEFUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBzaG93IHRoZSByZWxhdGlvbnMgYmV0d2VlbiB0ZW1wbGF0ZXMgYW5kIHRoZWlyCisjIGluc3RhbmNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVEVNUExBVEVfUkVMQVRJT05TICAgICA9IFlFUworCisjIElmIHRoZSBJTkNMVURFX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlIHNldCB0bworIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyB0aGUKKyMgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOQ0xVREVEX0JZX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlCisjIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZworIyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLiBEaXNhYmxpbmcgYSBjYWxsIGdyYXBoIGNhbiBiZQorIyBhY2NvbXBsaXNoZWQgYnkgbWVhbnMgb2YgdGhlIGNvbW1hbmQgXGhpZGVjYWxsZ3JhcGguCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQUxMRVJfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIKKyMgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4KKyMKKyMgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgdGltZSBvZiBhIHJ1bi4KKyMgU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbGVyIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLiBEaXNhYmxpbmcgYSBjYWxsZXIgZ3JhcGggY2FuIGJlCisjIGFjY29tcGxpc2hlZCBieSBtZWFucyBvZiB0aGUgY29tbWFuZCBcaGlkZWNhbGxlcmdyYXBoLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMRVJfR1JBUEggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBncmFwaGljYWwKKyMgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlCisjIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUKKyMgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZQorIyBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBpbWFnZSBmb3JtYXRzIHNlZSB0aGUgc2VjdGlvbgorIyBvdXRwdXQgZm9ybWF0cyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZG90IHRvb2wgKEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLykpLgorIyBOb3RlOiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlcgorIyB0byBtYWtlIHRoZSBTVkcgZmlsZXMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcworIyByZXF1aXJlbWVudCkuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHBuZywgcG5nOmNhaXJvLCBwbmc6Y2Fpcm86Y2Fpcm8sIHBuZzpjYWlybzpnZCwgcG5nOmdkLAorIyBwbmc6Z2Q6Z2QsIGpwZywganBnOmNhaXJvLCBqcGc6Y2Fpcm86Z2QsIGpwZzpnZCwganBnOmdkOmdkLCBnaWYsIGdpZjpjYWlybywKKyMgZ2lmOmNhaXJvOmdkLCBnaWY6Z2QsIGdpZjpnZDpnZCwgc3ZnLCBwbmc6Z2QsIHBuZzpnZDpnZCwgcG5nOmNhaXJvLAorIyBwbmc6Y2Fpcm86Z2QsIHBuZzpjYWlybzpjYWlybywgcG5nOmNhaXJvOmdkaXBsdXMsIHBuZzpnZGlwbHVzIGFuZAorIyBwbmc6Z2RpcGx1czpnZGlwbHVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcG5nLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHN2ZworCisjIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bworIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLiBUZXN0ZWQKKyMgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuCisjIE5vdGU6IEZvciBJRSA5KyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlCisjIHRoZSBTVkcgZmlsZXMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0lOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTworCisjIFRoZSBET1RfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCisjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfUEFUSCAgICAgICAgICAgICAgID0KKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRvdGZpbGUKKyMgY29tbWFuZCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0KKworIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKKyMgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPQorCisjIFRoZSBESUFGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRpYSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZGlhZmlsZQorIyBjb21tYW5kKS4KKworRElBRklMRV9ESVJTICAgICAgICAgICA9CisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIFBMQU5UVU1MX0pBUl9QQVRIIHRhZyBzaG91bGQgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZQorIyBwYXRoIHdoZXJlIGphdmEgY2FuIGZpbmQgdGhlIHBsYW50dW1sLmphciBmaWxlLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkCisjIFBsYW50VU1MIGlzIG5vdCB1c2VkIG9yIGNhbGxlZCBkdXJpbmcgYSBwcmVwcm9jZXNzaW5nIHN0ZXAuIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIHdhcm5pbmcgd2hlbiBpdCBlbmNvdW50ZXJzIGEgXHN0YXJ0dW1sIGNvbW1hbmQgaW4gdGhpcyBjYXNlIGFuZAorIyB3aWxsIG5vdCBnZW5lcmF0ZSBvdXRwdXQgZm9yIHRoZSBkaWFncmFtLgorCitQTEFOVFVNTF9KQVJfUEFUSCAgICAgID0KKworIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgUExBTlRVTUxfQ0ZHX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYQorIyBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHBsYW50dW1sLgorCisjIFBMQU5UVU1MX0NGR19GSUxFICAgID0KKworIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgc3BlY2lmaWVkIHBhdGhzIGFyZSBzZWFyY2hlZCBmb3IgZmlsZXMgc3BlY2lmaWVkIGJ5CisjIHRoZSAhaW5jbHVkZSBzdGF0ZW1lbnQgaW4gYSBwbGFudHVtbCBibG9jay4KKworUExBTlRVTUxfSU5DTFVERV9QQVRIICA9CisKKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygbm9kZXMKKyMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoIGJlY29tZXMKKyMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMgdmlzdWFsaXplZAorIyBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlIG51bWJlciBvZiBkaXJlY3QKKyMgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4KKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZSB0aGF0CisjIHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwMCwgZGVmYXVsdCB2YWx1ZTogNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfR1JBUEhfTUFYX05PREVTICAgID0gNTAKKworIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZSBncmFwaHMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUgZnJvbSB0aGUKKyMgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMgdGhhdCBsYXkKKyMgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIG9wdGlvbiB0byAxCisjIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UgY29kZSBiYXNlcy4gQWxzbworIyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5CisjIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMCwgZGVmYXVsdCB2YWx1ZTogMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK01BWF9ET1RfR1JBUEhfREVQVEggICAgPSAwCisKKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50CisjIGJhY2tncm91bmQuIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBkb3Qgb24gV2luZG93cyBkb2VzIG5vdCBzZWVtCisjIHRvIHN1cHBvcnQgdGhpcyBvdXQgb2YgdGhlIGJveC4KKyMKKyMgV2FybmluZzogRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB1c2VkLCBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0bworIyBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZiBhIGdyYXBoIChpLmUuIHRoZXkgYmVjb21lIGhhcmQgdG8KKyMgcmVhZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgdG8gYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dAorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzCisjIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApIHN1cHBvcnQKKyMgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBZRVMKKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlCisjIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZAorIyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90CisjIGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhcmlvdXMgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUwpkaWZmIC0tZ2l0IGEvZG9jcy9pbmRleC5yc3QgYi9kb2NzL2luZGV4LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzA3MDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9pbmRleC5yc3QKQEAgLTAsMCArMSwyIEBACitQU1lOQyAtIFBhcnRpYWwvRnVsbCBTeW5jIExpYnJhcnkgYmFzZWQgb24gQkYgYW5kIElCRgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9sYXlvdXQuaHRtbCBiL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9sYXlvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDlhMjdkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL2xheW91dC5odG1sCkBAIC0wLDAgKzEsODcgQEAKK3sjCisgICAgbmFtZWRfZGF0YV90aGVtZS9sYXlvdXQuaHRtbAorICAgIH5+fn5+fn5+fn5+fn5+fn5+CisjfQoreyUgZXh0ZW5kcyAiYmFzaWMvbGF5b3V0Lmh0bWwiICV9CisKK3slIGJsb2NrIGhlYWRlciAlfQorICAgIDwhLS1oZWFkZXJjb250YWluZXItLT4KKyAgICA8ZGl2IGlkPSJoZWFkZXJfY29udGFpbmVyIj4KKworICAgICAgICA8IS0taGVhZGVyLS0+CisgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CisgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGhyZWUgY29sdW1ucyI+CisgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJsb2dvIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vbmFtZWQtZGF0YS5uZXQiIHRpdGxlPSJBIEZ1dHVyZSBJbnRlcm5ldCBBcmNoaXRlY3R1cmUiPjxpbWcgc3JjPSJodHRwczovL25hbWVkLWRhdGEubmV0L3dwLWNvbnRlbnQvdXBsb2Fkcy9jcm9wcGVkLTIwMTMwNzIyX0xvZ28yLnBuZyIgYWx0PSIiIC8+PC9hPgorICAgICAgICAgICAgICAgICAgPC9kaXY+PCEtLWxvZ28gZW5kLS0+CisgICAgICAgICAgICAgPC9kaXY+CisKKyAgICAgICAgICAgICA8IS0tdG9wIG1lbnUtLT4KKyAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJuaW5lIGNvbHVtbnMiIGlkPSJtZW51X2NvbnRhaW5lciIgPgorICAgICAgICAgICAgICAgPGgxPjxhIGhyZWY9Int7IHBhdGh0byhtYXN0ZXJfZG9jKSB9fSI+e3sgc2hvcnR0aXRsZXxlIH19PC9hPjwvaDE+CisgICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PjwhLS1oZWFkZXIgY29udGFpbmVyIGVuZC0tPgorCit7JSBlbmRibG9jayAlfQorCit7JSBibG9jayBjb250ZW50ICV9CisgICAgPGRpdiBjbGFzcz0iY29udGVudC13cmFwcGVyIj4KKyAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgorICAgICAgICA8ZGl2IGNsYXNzPSJkb2N1bWVudCI+CisgICAgICAgICAgeyUtIGJsb2NrIGRvY3VtZW50ICV9CisgICAgICAgICAgICB7eyBzdXBlcigpIH19CisgICAgICAgICAgeyUtIGVuZGJsb2NrICV9CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIj4KKyAgICAgICAgICB7JS0gYmxvY2sgc2lkZWJhcnRvYyAlfQorICAgICAgICAgIDxoMz57eyBfKCdUYWJsZSBPZiBDb250ZW50cycpIH19PC9oMz4KKyAgICAgICAgICB7eyB0b2N0cmVlKGluY2x1ZGVoaWRkZW49VHJ1ZSkgfX0KKworICAgICAgICAgIDxoMz57eyBfKCdEZXZlbG9wZXIgZG9jdW1lbnRhdGlvbicpIH19PC9oMz4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGkgY2xhc3M9InRvY3RyZWUtbDEiPjxhIGNsYXNzPSJyZWZlcmVuY2UgZXh0ZXJuYWwiIGhyZWY9Imh0dHBzOi8vcmVkbWluZS5uYW1lZC1kYXRhLm5ldC9wcm9qZWN0cy9wc3luYy93aWtpIj5QU3luYyBXaWtpPC9hPjwvbGk+CisgICAgICAgICAgICA8bGkgY2xhc3M9InRvY3RyZWUtbDEiPjxhIGNsYXNzPSJyZWZlcmVuY2UgaW50ZXJuYWwiIGhyZWY9ImRveHlnZW4vYW5ub3RhdGVkLmh0bWwiPkFQSSBkb2N1bWVudGF0aW9uIChkb3h5Z2VuKTwvYT48L2xpPgorICAgICAgICAgICAgPGxpIGNsYXNzPSJ0b2N0cmVlLWwxIj48YSBjbGFzcz0icmVmZXJlbmNlIGludGVybmFsIiBocmVmPSJjb2RlLXN0eWxlLmh0bWwiPm5kbi1jeHggQ29kZSBTdHlsZSBhbmQgQ29kaW5nIEd1aWRlbGluZXM8L2E+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICAgIHslLSBlbmRibG9jayAlfQorCisgICAgICAgICAgeyUtIGJsb2NrIHNpZGViYXJzZWFyY2ggJX0KKyAgICAgICAgICA8aDMgc3R5bGU9Im1hcmdpbi10b3A6IDEuNWVtOyI+e3sgXygnU2VhcmNoJykgfX08L2gzPgorICAgICAgICAgIDxmb3JtIGNsYXNzPSJzZWFyY2giIGFjdGlvbj0ie3sgcGF0aHRvKCdzZWFyY2gnKSB9fSIgbWV0aG9kPSJnZXQiPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InEiIC8+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0ie3sgXygnR28nKSB9fSIgLz4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNoZWNrX2tleXdvcmRzIiB2YWx1ZT0ieWVzIiAvPgorICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYXJlYSIgdmFsdWU9ImRlZmF1bHQiIC8+CisgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgIDxwIGNsYXNzPSJzZWFyY2h0aXAiIHN0eWxlPSJmb250LXNpemU6IDkwJSI+CisgICAgICAgICAgICB7eyBfKCdFbnRlciBzZWFyY2ggdGVybXMgb3IgYSBtb2R1bGUsIGNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUuJykgfX0KKyAgICAgICAgICA8L3A+CisgICAgICAgICAgeyUtIGVuZGJsb2NrICV9CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmVyIj48L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgIDwvZGl2PgoreyUgZW5kYmxvY2sgJX0KKworeyUgYmxvY2sgZm9vdGVyICV9CisgICAgPGRpdiBpZD0iZm9vdGVyLWNvbnRhaW5lciI+CisgICAgICAgIDwhLS1mb290ZXIgY29udGFpbmVyLS0+CisgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CisgICAgICAgIDwvZGl2PjwhLS0gZm9vdGVyIGNvbnRhaW5lci0tPgorICAgIDwvZGl2PgorCisgICAgPGRpdiBpZD0iZm9vdGVyLWluZm8iPgorICAgICAgICA8IS0tZm9vdGVyIGNvbnRhaW5lci0tPgorICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0idHdlbHZlIGNvbHVtbnMiPgorCisgICAgICAgICAgICAgICAgPGRpdiBpZD0iY29weXJpZ2h0Ij5UaGlzIHJlc2VhcmNoIGlzIHBhcnRpYWxseSBzdXBwb3J0ZWQgYnkgTlNGIChBd2FyZCA8YSBocmVmPSJodHRwczovL3d3dy5uc2YuZ292L2F3YXJkc2VhcmNoL3Nob3dBd2FyZD9BV0RfSUQ9MTA0MDg2OCIgdGFyZ2V0PSJfYmxhbms+Ij5DTlMtMTA0MDg2ODwvYT4pPGJyLz48YnIvPjxhIHJlbD0ibGljZW5zZSIgaHJlZj0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC9kZWVkLmVuX1VTIiB0YXJnZXQ9Il9ibGFuayI+Q3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgVW5wb3J0ZWQgTGljZW5zZTwvYT4gZXhjZXB0IHdoZXJlIG5vdGVkLjwvZGl2PgorCisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgPC9kaXY+CisgICAgPC9kaXY+PCEtLWZvb3RlciBpbmZvIGVuZC0tPgoreyUgZW5kYmxvY2sgJX0KKworeyUgYmxvY2sgcmVsYmFyMSAlfXslIGVuZGJsb2NrICV9Cit7JSBibG9jayByZWxiYXIyICV9eyUgZW5kYmxvY2sgJX0KZGlmZiAtLWdpdCBhL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2Zvb3Rlci13aXRoLWFuYWx5dGljcy5odG1sLmluIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL25hbWVkX2RhdGFfZm9vdGVyLXdpdGgtYW5hbHl0aWNzLmh0bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjYjMxNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2Zvb3Rlci13aXRoLWFuYWx5dGljcy5odG1sLmluCkBAIC0wLDAgKzEsMzIgQEAKKzwhLS0gc3RhcnQgZm9vdGVyIHBhcnQgLS0+Cis8IS0tQkVHSU4gR0VORVJBVEVfVFJFRVZJRVctLT4KKzxkaXYgaWQ9Im5hdi1wYXRoIiBjbGFzcz0ibmF2cGF0aCI+PCEtLSBpZCBpcyBuZWVkZWQgZm9yIHRyZWV2aWV3IGZ1bmN0aW9uISAtLT4KKyAgPHVsPgorICAgICRuYXZwYXRoCisgICAgPGxpIGNsYXNzPSJmb290ZXIiPiRnZW5lcmF0ZWRieQorICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPgorICAgIDxpbWcgY2xhc3M9ImZvb3RlciIgc3JjPSIkcmVscGF0aCRkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIi8+PC9hPiAkZG94eWdlbnZlcnNpb24gPC9saT4KKyAgPC91bD4KKzwvZGl2PgorPCEtLUVORCBHRU5FUkFURV9UUkVFVklFVy0tPgorPCEtLUJFR0lOICFHRU5FUkFURV9UUkVFVklFVy0tPgorPGhyIGNsYXNzPSJmb290ZXIiLz4KKzxhZGRyZXNzIGNsYXNzPSJmb290ZXIiPjxzbWFsbD4KKyRnZW5lcmF0ZWRieSAmIzE2MDs8YSBocmVmPSJodHRwOi8vd3d3LmRveHlnZW4ub3JnL2luZGV4Lmh0bWwiPgorPGltZyBjbGFzcz0iZm9vdGVyIiBzcmM9IiRyZWxwYXRoJGRveHlnZW4ucG5nIiBhbHQ9ImRveHlnZW4iLz4KKzwvYT4gJGRveHlnZW52ZXJzaW9uCis8L3NtYWxsPjwvYWRkcmVzcz4KKzwhLS1FTkQgIUdFTkVSQVRFX1RSRUVWSUVXLS0+CisKKzxzY3JpcHQ+CisgIChmdW5jdGlvbihpLHMsbyxnLHIsYSxtKXtpWydHb29nbGVBbmFseXRpY3NPYmplY3QnXT1yO2lbcl09aVtyXXx8ZnVuY3Rpb24oKXsKKyAgKGlbcl0ucT1pW3JdLnF8fFtdKS5wdXNoKGFyZ3VtZW50cyl9LGlbcl0ubD0xKm5ldyBEYXRlKCk7YT1zLmNyZWF0ZUVsZW1lbnQobyksCisgIG09cy5nZXRFbGVtZW50c0J5VGFnTmFtZShvKVswXTthLmFzeW5jPTE7YS5zcmM9ZzttLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsbSkKKyAgfSkod2luZG93LGRvY3VtZW50LCdzY3JpcHQnLCcvL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS9hbmFseXRpY3MuanMnLCdnYScpOworCisgIGdhKCdjcmVhdGUnLCAnQEdPT0dMRV9BTkFMWVRJQ1NAJywgJ2F1dG8nKTsKKyAgZ2EoJ3NlbmQnLCAncGFnZXZpZXcnKTsKKzwvc2NyaXB0PgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL25hbWVkX2RhdGFfdGhlbWUvbmFtZWRfZGF0YV9mb290ZXIuaHRtbCBiL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2Zvb3Rlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMzc4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvbmFtZWRfZGF0YV9mb290ZXIuaHRtbApAQCAtMCwwICsxLDI0IEBACis8IS0tIHN0YXJ0IGZvb3RlciBwYXJ0IC0tPgorPCEtLUJFR0lOIEdFTkVSQVRFX1RSRUVWSUVXLS0+Cis8ZGl2IGlkPSJuYXYtcGF0aCIgY2xhc3M9Im5hdnBhdGgiPjwhLS0gaWQgaXMgbmVlZGVkIGZvciB0cmVldmlldyBmdW5jdGlvbiEgLS0+CisgIDx1bD4KKyAgICAkbmF2cGF0aAorICAgIDxsaSBjbGFzcz0iZm9vdGVyIj4kZ2VuZXJhdGVkYnkKKyAgICA8YSBocmVmPSJodHRwczovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4KKyAgICA8aW1nIGNsYXNzPSJmb290ZXIiIHNyYz0iJHJlbHBhdGgkZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIvPjwvYT4gJGRveHlnZW52ZXJzaW9uIDwvbGk+CisgIDwvdWw+Cis8L2Rpdj4KKzwhLS1FTkQgR0VORVJBVEVfVFJFRVZJRVctLT4KKzwhLS1CRUdJTiAhR0VORVJBVEVfVFJFRVZJRVctLT4KKzxociBjbGFzcz0iZm9vdGVyIi8+Cis8YWRkcmVzcyBjbGFzcz0iZm9vdGVyIj48c21hbGw+CiskZ2VuZXJhdGVkYnkgJiMxNjA7PGEgaHJlZj0iaHR0cDovL3d3dy5kb3h5Z2VuLm9yZy9pbmRleC5odG1sIj4KKzxpbWcgY2xhc3M9ImZvb3RlciIgc3JjPSIkcmVscGF0aCRkb3h5Z2VuLnBuZyIgYWx0PSJkb3h5Z2VuIi8+Cis8L2E+ICRkb3h5Z2VudmVyc2lvbgorPC9zbWFsbD48L2FkZHJlc3M+Cis8IS0tRU5EICFHRU5FUkFURV9UUkVFVklFVy0tPgorCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2hlYWRlci5odG1sIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL25hbWVkX2RhdGFfaGVhZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmN2QxYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2hlYWRlci5odG1sCkBAIC0wLDAgKzEsNDEgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwczovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cHM6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQveGh0bWw7Y2hhcnNldD1VVEYtOCIvPgorPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT05Ii8+Cis8IS0tQkVHSU4gUFJPSkVDVF9OQU1FLS0+PHRpdGxlPiRwcm9qZWN0bmFtZTogJHRpdGxlPC90aXRsZT48IS0tRU5EIFBST0pFQ1RfTkFNRS0tPgorPCEtLUJFR0lOICFQUk9KRUNUX05BTUUtLT48dGl0bGU+JHRpdGxlPC90aXRsZT48IS0tRU5EICFQUk9KRUNUX05BTUUtLT4KKzxsaW5rIGhyZWY9IiRyZWxwYXRoJHRhYnMuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIkcmVscGF0aCRqcXVlcnkuanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJHJlbHBhdGgkZHluc2VjdGlvbnMuanMiPjwvc2NyaXB0PgorJHRyZWV2aWV3Ciskc2VhcmNoCiskbWF0aGpheAorPGxpbmsgaHJlZj0iJHJlbHBhdGgkZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiLz4KKzxsaW5rIGhyZWY9IiRyZWxwYXRoJG5hbWVkX2RhdGFfZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIC8+Cis8bGluayBocmVmPSIkcmVscGF0aCRmYXZpY29uLmljbyIgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS9pY28iIC8+Cis8L2hlYWQ+Cis8Ym9keT4KKzxkaXYgaWQ9InRvcCI+PCEtLSBkbyBub3QgcmVtb3ZlIHRoaXMgZGl2LCBpdCBpcyBjbG9zZWQgYnkgZG94eWdlbiEgLS0+CisKKzwhLS1CRUdJTiBUSVRMRUFSRUEtLT4KKzwhLS1oZWFkZXJjb250YWluZXItLT4KKzxkaXYgaWQ9ImhlYWRlcl9jb250YWluZXIiPgorCisgICAgPCEtLWhlYWRlci0tPgorICAgIDxkaXYgY2xhc3M9InJvdyI+CisgICAgICAgICA8ZGl2IGNsYXNzPSJ0aHJlZSBjb2x1bW5zIj4KKyAgICAgICAgICAgICAgPGRpdiBpZD0ibG9nbyI+CisgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vbmFtZWQtZGF0YS5uZXQiIHRpdGxlPSJBIEZ1dHVyZSBJbnRlcm5ldCBBcmNoaXRlY3R1cmUiPjxpbWcgc3JjPSJodHRwczovL25hbWVkLWRhdGEubmV0L3dwLWNvbnRlbnQvdXBsb2Fkcy9jcm9wcGVkLTIwMTMwNzIyX0xvZ28yLnBuZyIgYWx0PSIiIC8+PC9hPgorICAgICAgICAgICAgICA8L2Rpdj48IS0tbG9nbyBlbmQtLT4KKyAgICAgICAgIDwvZGl2PgorCisgICAgICAgICA8IS0tdG9wIG1lbnUtLT4KKyAgICAgICAgIDxkaXYgY2xhc3M9Im5pbmUgY29sdW1ucyIgaWQ9Im1lbnVfY29udGFpbmVyIiA+CisgICAgICAgICAgIDxoMT48YSBocmVmPSJodHRwczovL25hbWVkLWRhdGEubmV0L2RvYy9QU3luYy8kcHJvamVjdG51bWJlci8iPiRwcm9qZWN0bmFtZSAkcHJvamVjdG51bWJlciBkb2N1bWVudGF0aW9uPC9hPjwvaDE+CisgICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PjwhLS1oZWFkZXIgY29udGFpbmVyIGVuZC0tPgorPCEtLUVORCBUSVRMRUFSRUEtLT4KKworPCEtLSBlbmQgaGVhZGVyIHBhcnQgLS0+CmRpZmYgLS1naXQgYS9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2Jhci10b3AucG5nIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iYXItdG9wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NhZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iYXItdG9wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2Jhc2UuY3NzIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iYXNlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjRkMWMxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iYXNlLmNzcwpAQCAtMCwwICsxLDcxIEBACisqIHsKKyAgbWFyZ2luOiAwcHg7CisgIHBhZGRpbmc6IDBweDsKK30KKworaHRtbCB7IGZvbnQtc2l6ZTogNjIuNSU7IH0KKworYm9keSB7CisgIGZvbnQtZmFtaWx5OiAiVmVyZGFuYSIsIEFyaWFsLCBzYW5zLXNlcmlmOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVjOworICBjb2xvcjogIzc3NzsKKyAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICNmZDc4MDA7Cit9CisKK2JvZHkgeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsICJIZWx2ZXRpY2EiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOyBjb2xvcjogIzIyMjIyMjsgcG9zaXRpb246IHJlbGF0aXZlOyAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsgfQorCisuY2xlYXJlciB7CisgIGNsZWFyOiBib3RoOworfQorCisubGVmdCB7CisgIGZsb2F0OiBsZWZ0OworfQorCisucmlnaHQgeworICBmbG9hdDogcmlnaHQ7Cit9CisKKy5saW5lLWJsb2NrIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tdG9wOiAxZW07CisgICAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCisubGluZS1ibG9jayAubGluZS1ibG9jayB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIG1hcmdpbi1sZWZ0OiAxLjVlbTsKK30KKworaDEsIGgyLCBoMywgaDQgeworICBmb250LWZhbWlseTogIkdlb3JnaWEiLCAiVGltZXMgTmV3IFJvbWFuIiwgc2VyaWY7CisgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgIGNvbG9yOiAjMzQ2NWE0OworICBtYXJnaW4tYm90dG9tOiAuOGVtOworfQorCitoMSB7CisgIGNvbG9yOiAjMjA0YTg3OworfQorCitoMiB7CisgIHBhZGRpbmctYm90dG9tOiAuNWVtOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzM0NjVhNDsKK30KKworYS5oZWFkZXJsaW5rIHsKKyAgdmlzaWJpbGl0eTogaGlkZGVuOworICBjb2xvcjogI2RkZGRkZDsKKyAgcGFkZGluZy1sZWZ0OiAuM2VtOworfQorCitoMTpob3ZlciA+IGEuaGVhZGVybGluaywKK2gyOmhvdmVyID4gYS5oZWFkZXJsaW5rLAoraDM6aG92ZXIgPiBhLmhlYWRlcmxpbmssCitoNDpob3ZlciA+IGEuaGVhZGVybGluaywKK2g1OmhvdmVyID4gYS5oZWFkZXJsaW5rLAoraDY6aG92ZXIgPiBhLmhlYWRlcmxpbmssCitkdDpob3ZlciA+IGEuaGVhZGVybGluayB7CisgIHZpc2liaWxpdHk6IHZpc2libGU7Cit9CmRpZmYgLS1naXQgYS9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2Jhc2UuY3NzX3QgYi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2Jhc2UuY3NzX3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkMzk3MwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvYmFzZS5jc3NfdApAQCAtMCwwICsxLDQ1OSBAQAorKiB7CisgIG1hcmdpbjogMHB4OworICBwYWRkaW5nOiAwcHg7Cit9CisKK2h0bWwgeyBmb250LXNpemU6IDYyLjUlOyB9CisKK2JvZHkgeworICBmb250LWZhbWlseToge3sgdGhlbWVfYm9keWZvbnQgfX07CisgIGJhY2tncm91bmQtY29sb3I6IHt7IHRoZW1lX2JnY29sb3IgfX07CisgIGNvbG9yOiAjNzc3OworICBib3JkZXItdG9wOiA0cHggc29saWQgI2ZkNzgwMDsKK30KKworYm9keSB7IGJhY2tncm91bmQ6IHdoaXRlOyBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgIkhlbHZldGljYSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE7IGNvbG9yOiAjMjIyMjIyOyBwb3NpdGlvbjogcmVsYXRpdmU7IC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOyB9CisKKy8qIFBhZ2UgbGF5b3V0ICovCisKK2Rpdi5oZWFkZXIsIGRpdi5jb250ZW50LCBkaXYuZm9vdGVyIHsKKyAgd2lkdGg6IDkwJTsKKyAgbWFyZ2luLWxlZnQ6IGF1dG87CisgIG1hcmdpbi1yaWdodDogYXV0bzsKK30KKworZGl2LmhlYWRlci13cmFwcGVyIHsKKyAgYmFja2dyb3VuZDoge3sgdGhlbWVfaGVhZGVyYmcgfX07CisgIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCAjMmUzNDM2OworfQorCisKKy8qIERlZmF1bHQgYm9keSBzdHlsZXMgKi8KK2EgeworICBjb2xvcjoge3sgdGhlbWVfbGlua2NvbG9yIH19OworfQorCitkaXYuYm9keXdyYXBwZXIgYSwgZGl2LmZvb3RlciBhIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisuY2xlYXJlciB7CisgIGNsZWFyOiBib3RoOworfQorCisubGVmdCB7CisgIGZsb2F0OiBsZWZ0OworfQorCisucmlnaHQgeworICBmbG9hdDogcmlnaHQ7Cit9CisKKy5saW5lLWJsb2NrIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tdG9wOiAxZW07CisgICAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCisubGluZS1ibG9jayAubGluZS1ibG9jayB7CisgICAgbWFyZ2luLXRvcDogMDsKKyAgICBtYXJnaW4tYm90dG9tOiAwOworICAgIG1hcmdpbi1sZWZ0OiAxLjVlbTsKK30KKworaDEsIGgyLCBoMywgaDQgeworICBmb250LWZhbWlseToge3sgdGhlbWVfaGVhZGVyZm9udCB9fTsKKyAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKKyAgY29sb3I6IHt7IHRoZW1lX2hlYWRlcmNvbG9yMiB9fTsKKyAgbWFyZ2luLWJvdHRvbTogLjhlbTsKK30KKworaDEgeworICBjb2xvcjoge3sgdGhlbWVfaGVhZGVyY29sb3IxIH19OworfQorCitoMiB7CisgIHBhZGRpbmctYm90dG9tOiAuNWVtOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQge3sgdGhlbWVfaGVhZGVyY29sb3IyIH19OworfQorCithLmhlYWRlcmxpbmsgeworICB2aXNpYmlsaXR5OiBoaWRkZW47CisgIGNvbG9yOiAjZGRkZGRkOworICBwYWRkaW5nLWxlZnQ6IC4zZW07Cit9CisKK2gxOmhvdmVyID4gYS5oZWFkZXJsaW5rLAoraDI6aG92ZXIgPiBhLmhlYWRlcmxpbmssCitoMzpob3ZlciA+IGEuaGVhZGVybGluaywKK2g0OmhvdmVyID4gYS5oZWFkZXJsaW5rLAoraDU6aG92ZXIgPiBhLmhlYWRlcmxpbmssCitoNjpob3ZlciA+IGEuaGVhZGVybGluaywKK2R0OmhvdmVyID4gYS5oZWFkZXJsaW5rIHsKKyAgdmlzaWJpbGl0eTogdmlzaWJsZTsKK30KKworaW1nIHsKKyAgYm9yZGVyOiAwOworfQorCitkaXYuYWRtb25pdGlvbiB7CisgIG1hcmdpbi10b3A6IDEwcHg7CisgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgIHBhZGRpbmc6IDJweCA3cHggMXB4IDdweDsKKyAgYm9yZGVyLWxlZnQ6IDAuMmVtIHNvbGlkIGJsYWNrOworfQorCitwLmFkbW9uaXRpb24tdGl0bGUgeworICBtYXJnaW46IDBweCAxMHB4IDVweCAwcHg7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCitkdDp0YXJnZXQsIC5oaWdobGlnaHRlZCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNmYmU1NGU7Cit9CisKKy8qIEhlYWRlciAqLworCitkaXYuaGVhZGVyIHsKKyAgcGFkZGluZy10b3A6IDEwcHg7CisgIHBhZGRpbmctYm90dG9tOiAxMHB4OworfQorCitkaXYuaGVhZGVyIC5oZWFkZXJ0aXRsZSB7CisgIGZvbnQtZmFtaWx5OiB7eyB0aGVtZV9oZWFkZXJmb250IH19OworICBmb250LXdlaWdodDogbm9ybWFsOworICBmb250LXNpemU6IDE4MCU7CisgIGxldHRlci1zcGFjaW5nOiAuMDhlbTsKKyAgbWFyZ2luLWJvdHRvbTogLjhlbTsKK30KKworZGl2LmhlYWRlciAuaGVhZGVydGl0bGUgYSB7CisgIGNvbG9yOiB3aGl0ZTsKK30KKworZGl2LmhlYWRlciBkaXYucmVsIHsKKyAgbWFyZ2luLXRvcDogMWVtOworfQorCitkaXYuaGVhZGVyIGRpdi5yZWwgYSB7CisgIGNvbG9yOiB7eyB0aGVtZV9oZWFkZXJsaW5rY29sb3IgfX07CisgIGxldHRlci1zcGFjaW5nOiAuMWVtOworICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworfQorCitwLmxvZ28geworICAgIGZsb2F0OiByaWdodDsKK30KKworaW1nLmxvZ28geworICAgIGJvcmRlcjogMDsKK30KKworCisvKiBDb250ZW50ICovCitkaXYuY29udGVudC13cmFwcGVyIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisgIHBhZGRpbmctdG9wOiAyMHB4OworICBwYWRkaW5nLWJvdHRvbTogMjBweDsKK30KKworZGl2LmRvY3VtZW50IHsKKyAgd2lkdGg6IDcwJTsKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKK2Rpdi5ib2R5IHsKKyAgcGFkZGluZy1yaWdodDogMmVtOworICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCitkaXYuZG9jdW1lbnQgaDEgeworICBsaW5lLWhlaWdodDogMTIwJTsKK30KKworZGl2LmRvY3VtZW50IHVsIHsKKyAgbWFyZ2luLWxlZnQ6IDEuNWVtOworICBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKK30KKworZGl2LmRvY3VtZW50IGRkIHsKKyAgbWFyZ2luLWxlZnQ6IDEuMmVtOworICBtYXJnaW4tdG9wOiAuNGVtOworICBtYXJnaW4tYm90dG9tOiAxZW07Cit9CisKK2Rpdi5kb2N1bWVudCAuc2VjdGlvbiB7CisgIG1hcmdpbi10b3A6IDEuN2VtOworfQorZGl2LmRvY3VtZW50IC5zZWN0aW9uOmZpcnN0LWNoaWxkIHsKKyAgbWFyZ2luLXRvcDogMHB4OworfQorCitkaXYuZG9jdW1lbnQgZGl2LmhpZ2hsaWdodCB7CisgIHBhZGRpbmc6IDNweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlYzsKKyAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICNkZGRkZGQ7CisgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZGRkZGRkOworICBtYXJnaW4tYm90dG9tOiAuOGVtOworfQorCitkaXYuZG9jdW1lbnQgaDIgeworICBtYXJnaW4tdG9wOiAuN2VtOworfQorCitkaXYuZG9jdW1lbnQgcCB7CisgIG1hcmdpbi1ib3R0b206IC41ZW07Cit9CisKK2Rpdi5kb2N1bWVudCBsaS50b2N0cmVlLWwxIHsKKyAgbWFyZ2luLWJvdHRvbTogMWVtOworfQorCitkaXYuZG9jdW1lbnQgLmRlc2NuYW1lIHsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2Rpdi5kb2N1bWVudCAuZG9jdXRpbHMubGl0ZXJhbCB7CisgIGJhY2tncm91bmQtY29sb3I6ICNlZWVlZWM7CisgIHBhZGRpbmc6IDFweDsKK30KKworZGl2LmRvY3VtZW50IC5kb2N1dGlscy54cmVmLmxpdGVyYWwgeworICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgcGFkZGluZzogMHB4OworfQorCitkaXYuZG9jdW1lbnQgb2wgeworICBtYXJnaW46IDEuNWVtOworfQorCisKKy8qIFNpZGViYXIgKi8KKworZGl2LnNpZGViYXIgeworICB3aWR0aDogMjAlOworICBmbG9hdDogcmlnaHQ7CisgIGZvbnQtc2l6ZTogLjllbTsKK30KKworZGl2LnNpZGViYXIgYSwgZGl2LmhlYWRlciBhIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCitkaXYuc2lkZWJhciBhOmhvdmVyLCBkaXYuaGVhZGVyIGE6aG92ZXIgeworICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2Rpdi5zaWRlYmFyIGgzIHsKKyAgY29sb3I6ICMyZTM0MzY7CisgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CisgIGZvbnQtc2l6ZTogMTMwJTsKKyAgbGV0dGVyLXNwYWNpbmc6IC4xZW07Cit9CisKK2Rpdi5zaWRlYmFyIHVsIHsKKyAgbGlzdC1zdHlsZS10eXBlOiBub25lOworfQorCitkaXYuc2lkZWJhciBsaS50b2N0cmVlLWwxIGEgeworICBkaXNwbGF5OiBibG9jazsKKyAgcGFkZGluZzogMXB4OworICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVjOworICBtYXJnaW4tYm90dG9tOiAuNGVtOworICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgY29sb3I6ICMyZTM0MzY7Cit9CisKK2Rpdi5zaWRlYmFyIGxpLnRvY3RyZWUtbDIgYSB7CisgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OworICBib3JkZXI6IG5vbmU7CisgIG1hcmdpbi1sZWZ0OiAxZW07CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkZGRkOworfQorCitkaXYuc2lkZWJhciBsaS50b2N0cmVlLWwzIGEgeworICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgYm9yZGVyOiBub25lOworICBtYXJnaW4tbGVmdDogMmVtOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZGRkZDsKK30KKworZGl2LnNpZGViYXIgbGkudG9jdHJlZS1sMjpsYXN0LWNoaWxkIGEgeworICBib3JkZXItYm90dG9tOiBub25lOworfQorCitkaXYuc2lkZWJhciBsaS50b2N0cmVlLWwxLmN1cnJlbnQgYSB7CisgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHt7IHRoZW1lX2hlYWRlcmxpbmtjb2xvciB9fTsKK30KKworZGl2LnNpZGViYXIgbGkudG9jdHJlZS1sMS5jdXJyZW50IGxpLnRvY3RyZWUtbDIgYSB7CisgIGJvcmRlci1yaWdodDogbm9uZTsKK30KKworZGl2LnNpZGViYXIgaW5wdXRbdHlwZT0idGV4dCJdIHsKKyAgd2lkdGg6IDE3MHB4OworfQorCitkaXYuc2lkZWJhciBpbnB1dFt0eXBlPSJzdWJtaXQiXSB7CisgIHdpZHRoOiAzMHB4OworfQorCisKKy8qIEZvb3RlciAqLworCitkaXYuZm9vdGVyLXdyYXBwZXIgeworICBiYWNrZ3JvdW5kOiB7eyB0aGVtZV9mb290ZXJiZyB9fTsKKyAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICNiYWJkYjY7CisgIHBhZGRpbmctdG9wOiAxMHB4OworICBwYWRkaW5nLWJvdHRvbTogMTBweDsKKyAgbWluLWhlaWdodDogODBweDsKK30KKworZGl2LmZvb3RlciwgZGl2LmZvb3RlciBhIHsKKyAgY29sb3I6ICM4ODhhODU7Cit9CisKK2Rpdi5mb290ZXIgLnJpZ2h0IHsKKyAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKK2Rpdi5mb290ZXIgLmxlZnQgeworICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworfQorCisKKy8qIFN0eWxlcyBjb3BpZWQgZnJvbSBiYXNpYyB0aGVtZSAqLworCitpbWcuYWxpZ24tbGVmdCwgLmZpZ3VyZS5hbGlnbi1sZWZ0LCBvYmplY3QuYWxpZ24tbGVmdCB7CisgICAgY2xlYXI6IGxlZnQ7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgbWFyZ2luLXJpZ2h0OiAxZW07Cit9CisKK2ltZy5hbGlnbi1yaWdodCwgLmZpZ3VyZS5hbGlnbi1yaWdodCwgb2JqZWN0LmFsaWduLXJpZ2h0IHsKKyAgICBjbGVhcjogcmlnaHQ7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIG1hcmdpbi1sZWZ0OiAxZW07Cit9CisKK2ltZy5hbGlnbi1jZW50ZXIsIC5maWd1cmUuYWxpZ24tY2VudGVyLCBvYmplY3QuYWxpZ24tY2VudGVyIHsKKyAgZGlzcGxheTogYmxvY2s7CisgIG1hcmdpbi1sZWZ0OiBhdXRvOworICBtYXJnaW4tcmlnaHQ6IGF1dG87Cit9CisKKy5hbGlnbi1sZWZ0IHsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCisuYWxpZ24tY2VudGVyIHsKKyAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKy5hbGlnbi1yaWdodCB7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy8qIC0tIHNlYXJjaCBwYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3VsLnNlYXJjaCB7CisgICAgbWFyZ2luOiAxMHB4IDAgMCAyMHB4OworICAgIHBhZGRpbmc6IDA7Cit9CisKK3VsLnNlYXJjaCBsaSB7CisgICAgcGFkZGluZzogNXB4IDAgNXB4IDIwcHg7CisgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGZpbGUucG5nKTsKKyAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OworICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgN3B4OworfQorCit1bC5zZWFyY2ggbGkgYSB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK3VsLnNlYXJjaCBsaSBkaXYuY29udGV4dCB7CisgICAgY29sb3I6ICM4ODg7CisgICAgbWFyZ2luOiAycHggMCAwIDMwcHg7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KKwordWwua2V5d29yZG1hdGNoZXMgbGkuZ29vZG1hdGNoIGEgeworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisvKiAtLSBpbmRleCBwYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0YWJsZS5jb250ZW50c3RhYmxlIHsKKyAgICB3aWR0aDogOTAlOworfQorCit0YWJsZS5jb250ZW50c3RhYmxlIHAuYmlnbGluayB7CisgICAgbGluZS1oZWlnaHQ6IDE1MCU7Cit9CisKK2EuYmlnbGluayB7CisgICAgZm9udC1zaXplOiAxLjNlbTsKK30KKworc3Bhbi5saW5rZGVzY3IgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBwYWRkaW5nLXRvcDogNXB4OworICAgIGZvbnQtc2l6ZTogOTAlOworfQorCisvKiAtLSBnZW5lcmFsIGluZGV4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0YWJsZS5pbmRleHRhYmxlIHRkIHsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKK3RhYmxlLmluZGV4dGFibGUgZGwsIHRhYmxlLmluZGV4dGFibGUgZGQgeworICAgIG1hcmdpbi10b3A6IDA7CisgICAgbWFyZ2luLWJvdHRvbTogMDsKK30KKwordGFibGUuaW5kZXh0YWJsZSB0ci5wY2FwIHsKKyAgICBoZWlnaHQ6IDEwcHg7Cit9CisKK3RhYmxlLmluZGV4dGFibGUgdHIuY2FwIHsKKyAgICBtYXJnaW4tdG9wOiAxMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7Cit9CisKK2ltZy50b2dnbGVyIHsKKyAgICBtYXJnaW4tcmlnaHQ6IDNweDsKKyAgICBtYXJnaW4tdG9wOiAzcHg7CisgICAgY3Vyc29yOiBwb2ludGVyOworfQorCisvKiAtLSB2aWV3Y29kZSBleHRlbnNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisudmlld2NvZGUtbGluayB7CisgICAgZmxvYXQ6IHJpZ2h0OworfQorCisudmlld2NvZGUtYmFjayB7CisgICAgZmxvYXQ6IHJpZ2h0OworICAgIGZvbnQtZmFtaWx5Ojoge3sgdGhlbWVfYm9keWZvbnQgfX07Cit9CisKK2Rpdi52aWV3Y29kZS1ibG9jazp0YXJnZXQgeworICAgIG1hcmdpbjogLTFweCAtM3B4OworICAgIHBhZGRpbmc6IDAgM3B4OworICAgIGJhY2tncm91bmQtY29sb3I6ICNmNGRlYmY7CisgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNhYzk7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNhYzk7Cit9CisKK3RkLmxpbmVub3MgcHJlIHsKKyAgICBwYWRkaW5nOiA1cHggMHB4OworICAgIGJvcmRlcjogMDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKKyAgICBjb2xvcjogI2FhYTsKKyAgICBtYXJnaW4tdG9wOiAtMTBwdDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2JjX3MucG5nIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iY19zLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWJmODYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9iY19zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2RlZmF1bHQuY3NzX3QgYi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2RlZmF1bHQuY3NzX3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4Mjc2OAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvZGVmYXVsdC5jc3NfdApAQCAtMCwwICsxLDE0IEBACitAaW1wb3J0IHVybCgiYWdvZ28uY3NzIik7CisKK3ByZSB7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOworICAgIGNvbG9yOiAjMjIyOworICAgIGxpbmUtaGVpZ2h0OiAxLjJlbTsKKyAgICBib3JkZXI6IDJweCBzb2xpZCAjQzZDOUNCOworICAgIGZvbnQtc2l6ZTogMS4xZW07CisgICAgLyogbWFyZ2luOiAxLjVlbSAwIDEuNWVtIDA7ICovCisgICAgbWFyZ2luOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKK30KZGlmZiAtLWdpdCBhL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvZG94eWdlbi5jc3MgYi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2RveHlnZW4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Yzc5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2RveHlnZW4uY3NzCkBAIC0wLDAgKzEsMTE1NyBAQAorLyogVGhlIHN0YW5kYXJkIENTUyBmb3IgZG94eWdlbiAqLworCitib2R5LCB0YWJsZSwgZGl2LCBwLCBkbCB7CisJZm9udC1mYW1pbHk6IEx1Y2lkYSBHcmFuZGUsIFZlcmRhbmEsIEdlbmV2YSwgQXJpYWwsIHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiAxM3B4OworCWxpbmUtaGVpZ2h0OiAxLjM7Cit9CisKKy8qIEBncm91cCBIZWFkaW5nIExldmVscyAqLworCitoMSB7CisJZm9udC1zaXplOiAxNTAlOworfQorCisudGl0bGUgeworCWZvbnQtc2l6ZTogMTUwJTsKKwlmb250LXdlaWdodDogYm9sZDsKKwltYXJnaW46IDEwcHggMnB4OworfQorCitoMiB7CisJZm9udC1zaXplOiAxMjAlOworfQorCitoMyB7CisJZm9udC1zaXplOiAxMDAlOworfQorCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKKwktd2Via2l0LXRyYW5zaXRpb246IHRleHQtc2hhZG93IDAuNXMgbGluZWFyOworCS1tb3otdHJhbnNpdGlvbjogdGV4dC1zaGFkb3cgMC41cyBsaW5lYXI7CisJLW1zLXRyYW5zaXRpb246IHRleHQtc2hhZG93IDAuNXMgbGluZWFyOworCS1vLXRyYW5zaXRpb246IHRleHQtc2hhZG93IDAuNXMgbGluZWFyOworCXRyYW5zaXRpb246IHRleHQtc2hhZG93IDAuNXMgbGluZWFyOworCW1hcmdpbi1yaWdodDogMTVweDsKK30KKworaDEuZ2xvdywgaDIuZ2xvdywgaDMuZ2xvdywgaDQuZ2xvdywgaDUuZ2xvdywgaDYuZ2xvdyB7CisJdGV4dC1zaGFkb3c6IDAgMCAxNXB4IGN5YW47Cit9CisKK2R0IHsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKworZGl2Lm11bHRpY29sIHsKKwktbW96LWNvbHVtbi1nYXA6IDFlbTsKKwktd2Via2l0LWNvbHVtbi1nYXA6IDFlbTsKKwktbW96LWNvbHVtbi1jb3VudDogMzsKKwktd2Via2l0LWNvbHVtbi1jb3VudDogMzsKK30KKworcC5zdGFydGxpLCBwLnN0YXJ0ZGQsIHAuc3RhcnR0ZCB7CisJbWFyZ2luLXRvcDogMnB4OworfQorCitwLmVuZGxpIHsKKwltYXJnaW4tYm90dG9tOiAwcHg7Cit9CisKK3AuZW5kZGQgeworCW1hcmdpbi1ib3R0b206IDRweDsKK30KKworcC5lbmR0ZCB7CisJbWFyZ2luLWJvdHRvbTogMnB4OworfQorCisvKiBAZW5kICovCisKK2NhcHRpb24geworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCitzcGFuLmxlZ2VuZCB7CisgICAgICAgIGZvbnQtc2l6ZTogNzAlOworICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKK2gzLnZlcnNpb24geworICAgICAgICBmb250LXNpemU6IDkwJTsKKyAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOworfQorCitkaXYucWluZGV4LCBkaXYubmF2dGFieworCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7CisJYm9yZGVyOiAxcHggc29saWQgI0I1QjVCNTsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKK2Rpdi5xaW5kZXgsIGRpdi5uYXZwYXRoIHsKKwl3aWR0aDogMTAwJTsKKwlsaW5lLWhlaWdodDogMTQwJTsKK30KKworZGl2Lm5hdnRhYiB7CisJbWFyZ2luLXJpZ2h0OiAxNXB4OworfQorCisvKiBAZ3JvdXAgTGluayBTdHlsaW5nICovCisKK2EgeworCWNvbG9yOiAjNTg1ODU4OworCWZvbnQtd2VpZ2h0OiBub3JtYWw7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCisvKi5jb250ZW50cyBhOnZpc2l0ZWQgeworCWNvbG9yOiAjNjg2ODY4OworfSovCisKK2E6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCithLnFpbmRleCB7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2EucWluZGV4SEwgeworCWZvbnQtd2VpZ2h0OiBib2xkOworCWJhY2tncm91bmQtY29sb3I6ICNCMEIwQjA7CisJY29sb3I6ICNmZmZmZmY7CisJYm9yZGVyOiAxcHggZG91YmxlICM5RjlGOUY7Cit9CisKKy5jb250ZW50cyBhLnFpbmRleEhMOnZpc2l0ZWQgeworICAgICAgICBjb2xvcjogI2ZmZmZmZjsKK30KKworYS5lbCB7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2EuZWxSZWYgeworfQorCithLmNvZGUsIGEuY29kZTp2aXNpdGVkIHsKKwljb2xvcjogIzQ2NjVBMjsKK30KKworYS5jb2RlUmVmLCBhLmNvZGVSZWY6dmlzaXRlZCB7CisJY29sb3I6ICM0NjY1QTI7Cit9CisKKy8qIEBlbmQgKi8KKworZGwuZWwgeworCW1hcmdpbi1sZWZ0OiAtMWNtOworfQorCitwcmUuZnJhZ21lbnQgeworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjQzRDRkU1OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkJGQ0ZEOworICAgICAgICBwYWRkaW5nOiA0cHggNnB4OworICAgICAgICBtYXJnaW46IDRweCA4cHggNHB4IDJweDsKKyAgICAgICAgb3ZlcmZsb3c6IGF1dG87CisgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKKyAgICAgICAgZm9udC1zaXplOiAgOXB0OworICAgICAgICBsaW5lLWhlaWdodDogMTI1JTsKKyAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgZml4ZWQ7CisgICAgICAgIGZvbnQtc2l6ZTogMTA1JTsKK30KKworZGl2LmZyYWdtZW50IHsKKyAgICAgICAgcGFkZGluZzogNHB4OworICAgICAgICBtYXJnaW46IDRweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRkNGQ0ZDOworCWJvcmRlcjogMXB4IHNvbGlkICNEMEQwRDA7Cit9CisKK2Rpdi5saW5lIHsKKwlmb250LWZhbWlseTogbW9ub3NwYWNlLCBmaXhlZDsKKyAgICAgICAgZm9udC1zaXplOiAxM3B4OworCW1pbi1oZWlnaHQ6IDEzcHg7CisJbGluZS1oZWlnaHQ6IDEuMDsKKwl0ZXh0LXdyYXA6IHVucmVzdHJpY3RlZDsKKwl3aGl0ZS1zcGFjZTogLW1vei1wcmUtd3JhcDsgLyogTW96ICovCisJd2hpdGUtc3BhY2U6IC1wcmUtd3JhcDsgICAgIC8qIE9wZXJhIDQtNiAqLworCXdoaXRlLXNwYWNlOiAtby1wcmUtd3JhcDsgICAvKiBPcGVyYSA3ICovCisJd2hpdGUtc3BhY2U6IHByZS13cmFwOyAgICAgIC8qIENTUzMgICovCisJd29yZC13cmFwOiBicmVhay13b3JkOyAgICAgIC8qIElFIDUuNSsgKi8KKwl0ZXh0LWluZGVudDogLTUzcHg7CisJcGFkZGluZy1sZWZ0OiA1M3B4OworCXBhZGRpbmctYm90dG9tOiAwcHg7CisJbWFyZ2luOiAwcHg7CisJLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yLCBib3gtc2hhZG93OworCS13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC41czsKKwktbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3IsIGJveC1zaGFkb3c7CisJLW1vei10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzOworCS1tcy10cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yLCBib3gtc2hhZG93OworCS1tcy10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzOworCS1vLXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3IsIGJveC1zaGFkb3c7CisJLW8tdHJhbnNpdGlvbi1kdXJhdGlvbjogMC41czsKKwl0cmFuc2l0aW9uLXByb3BlcnR5OiBiYWNrZ3JvdW5kLWNvbG9yLCBib3gtc2hhZG93OworCXRyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7Cit9CisKK2Rpdi5saW5lLmdsb3cgeworCWJhY2tncm91bmQtY29sb3I6IGN5YW47CisJYm94LXNoYWRvdzogMCAwIDEwcHggY3lhbjsKK30KKworCitzcGFuLmxpbmVubyB7CisJcGFkZGluZy1yaWdodDogNHB4OworCXRleHQtYWxpZ246IHJpZ2h0OworCWJvcmRlci1yaWdodDogMnB4IHNvbGlkICMwRjA7CisJYmFja2dyb3VuZC1jb2xvcjogI0U4RThFODsKKyAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKK30KK3NwYW4ubGluZW5vIGEgeworCWJhY2tncm91bmQtY29sb3I6ICNEOEQ4RDg7Cit9CisKK3NwYW4ubGluZW5vIGE6aG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNDOEM4Qzg7Cit9CisKK2Rpdi5haCB7CisJYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJY29sb3I6ICNmZmZmZmY7CisJbWFyZ2luLWJvdHRvbTogM3B4OworCW1hcmdpbi10b3A6IDNweDsKKwlwYWRkaW5nOiAwLjJlbTsKKwlib3JkZXI6IHNvbGlkIHRoaW4gIzMzMzsKKwlib3JkZXItcmFkaXVzOiAwLjVlbTsKKwktd2Via2l0LWJvcmRlci1yYWRpdXM6IC41ZW07CisJLW1vei1ib3JkZXItcmFkaXVzOiAuNWVtOworCWJveC1zaGFkb3c6IDJweCAycHggM3B4ICM5OTk7CisJLXdlYmtpdC1ib3gtc2hhZG93OiAycHggMnB4IDNweCAjOTk5OworCS1tb3otYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjE1KSAycHggMnB4IDJweDsKKwliYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgbGVmdCB0b3AsIGxlZnQgYm90dG9tLCBmcm9tKCNlZWUpLCB0bygjMDAwKSxjb2xvci1zdG9wKDAuMywgIzQ0NCkpOworCWJhY2tncm91bmQtaW1hZ2U6IC1tb3otbGluZWFyLWdyYWRpZW50KGNlbnRlciB0b3AsICNlZWUgMCUsICM0NDQgNDAlLCAjMDAwKTsKK30KKworZGl2Lmdyb3VwSGVhZGVyIHsKKwltYXJnaW4tbGVmdDogMTZweDsKKwltYXJnaW4tdG9wOiAxMnB4OworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCitkaXYuZ3JvdXBUZXh0IHsKKwltYXJnaW4tbGVmdDogMTZweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKK2JvZHkgeworCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOworCWNvbG9yOiBibGFjazsKKyAgICAgICAgbWFyZ2luOiAwOworfQorCitkaXYuY29udGVudHMgeworCW1hcmdpbi10b3A6IDEwcHg7CisJbWFyZ2luLWxlZnQ6IDEycHg7CisJbWFyZ2luLXJpZ2h0OiA4cHg7Cit9CisKK3RkLmluZGV4a2V5IHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOworCWZvbnQtd2VpZ2h0OiBib2xkOworCWJvcmRlcjogMXB4IHNvbGlkICNEMEQwRDA7CisJbWFyZ2luOiAycHggMHB4IDJweCAwOworCXBhZGRpbmc6IDJweCAxMHB4OworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCit0ZC5pbmRleHZhbHVlIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOworCWJvcmRlcjogMXB4IHNvbGlkICNEMEQwRDA7CisJcGFkZGluZzogMnB4IDEwcHg7CisJbWFyZ2luOiAycHggMHB4OworfQorCit0ci5tZW1saXN0IHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjFGMUYxOworfQorCitwLmZvcm11bGFEc3AgeworCXRleHQtYWxpZ246IGNlbnRlcjsKK30KKworaW1nLmZvcm11bGFEc3AgeworCit9CisKK2ltZy5mb3JtdWxhSW5sIHsKKwl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCitkaXYuY2VudGVyIHsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisgICAgICAgIG1hcmdpbi10b3A6IDBweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMHB4OworICAgICAgICBwYWRkaW5nOiAwcHg7Cit9CisKK2Rpdi5jZW50ZXIgaW1nIHsKKwlib3JkZXI6IDBweDsKK30KKworYWRkcmVzcy5mb290ZXIgeworCXRleHQtYWxpZ246IHJpZ2h0OworCXBhZGRpbmctcmlnaHQ6IDEycHg7Cit9CisKK2ltZy5mb290ZXIgeworCWJvcmRlcjogMHB4OworCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisKKy8qIEBncm91cCBDb2RlIENvbG9yaXphdGlvbiAqLworCitzcGFuLmtleXdvcmQgeworCWNvbG9yOiAjMDA4MDAwCit9CisKK3NwYW4ua2V5d29yZHR5cGUgeworCWNvbG9yOiAjNjA0MDIwCit9CisKK3NwYW4ua2V5d29yZGZsb3cgeworCWNvbG9yOiAjZTA4MDAwCit9CisKK3NwYW4uY29tbWVudCB7CisJY29sb3I6ICM4MDAwMDAKK30KKworc3Bhbi5wcmVwcm9jZXNzb3IgeworCWNvbG9yOiAjODA2MDIwCit9CisKK3NwYW4uc3RyaW5nbGl0ZXJhbCB7CisJY29sb3I6ICMwMDIwODAKK30KKworc3Bhbi5jaGFybGl0ZXJhbCB7CisJY29sb3I6ICMwMDgwODAKK30KKworc3Bhbi52aGRsZGlnaXQgeworCWNvbG9yOiAjZmYwMGZmCit9CisKK3NwYW4udmhkbGNoYXIgeworCWNvbG9yOiAjMDAwMDAwCit9CisKK3NwYW4udmhkbGtleXdvcmQgeworCWNvbG9yOiAjNzAwMDcwCit9CisKK3NwYW4udmhkbGxvZ2ljIHsKKwljb2xvcjogI2ZmMDAwMAorfQorCitibG9ja3F1b3RlIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0Y4RjhGODsKKyAgICAgICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjQjBCMEIwOworICAgICAgICBtYXJnaW46IDAgMjRweCAwIDRweDsKKyAgICAgICAgcGFkZGluZzogMCAxMnB4IDAgMTZweDsKK30KKworLyogQGVuZCAqLworCisvKgorLnNlYXJjaCB7CisJY29sb3I6ICMwMDMzOTk7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2Zvcm0uc2VhcmNoIHsKKwltYXJnaW4tYm90dG9tOiAwcHg7CisJbWFyZ2luLXRvcDogMHB4OworfQorCitpbnB1dC5zZWFyY2ggeworCWZvbnQtc2l6ZTogNzUlOworCWNvbG9yOiAjMDAwMDgwOworCWZvbnQtd2VpZ2h0OiBub3JtYWw7CisJYmFja2dyb3VuZC1jb2xvcjogI2U4ZWVmMjsKK30KKyovCisKK3RkLnRpbnkgeworCWZvbnQtc2l6ZTogNzUlOworfQorCisuZGlydGFiIHsKKwlwYWRkaW5nOiA0cHg7CisJYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKwlib3JkZXI6IDFweCBzb2xpZCAjQjVCNUI1OworfQorCit0aC5kaXJ0YWIgeworCWJhY2tncm91bmQ6ICNFRkVGRUY7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK2hyIHsKKwloZWlnaHQ6IDBweDsKKwlib3JkZXI6IG5vbmU7CisJYm9yZGVyLXRvcDogMXB4IHNvbGlkICM2RTZFNkU7Cit9CisKK2hyLmZvb3RlciB7CisJaGVpZ2h0OiAxcHg7Cit9CisKKy8qIEBncm91cCBNZW1iZXIgRGVzY3JpcHRpb25zICovCisKK3RhYmxlLm1lbWJlcmRlY2xzIHsKKwlib3JkZXItc3BhY2luZzogMHB4OworCXBhZGRpbmc6IDBweDsKK30KKworLm1lbWJlcmRlY2xzIHRkIHsKKwktd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3IsIGJveC1zaGFkb3c7CisJLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzOworCS1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvciwgYm94LXNoYWRvdzsKKwktbW96LXRyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7CisJLW1zLXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3IsIGJveC1zaGFkb3c7CisJLW1zLXRyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7CisJLW8tdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvciwgYm94LXNoYWRvdzsKKwktby10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzOworCXRyYW5zaXRpb24tcHJvcGVydHk6IGJhY2tncm91bmQtY29sb3IsIGJveC1zaGFkb3c7CisJdHJhbnNpdGlvbi1kdXJhdGlvbjogMC41czsKK30KKworLm1lbWJlcmRlY2xzIHRkLmdsb3cgeworCWJhY2tncm91bmQtY29sb3I6IGN5YW47CisJYm94LXNoYWRvdzogMCAwIDE1cHggY3lhbjsKK30KKworLm1kZXNjTGVmdCwgLm1kZXNjUmlnaHQsCisubWVtSXRlbUxlZnQsIC5tZW1JdGVtUmlnaHQsCisubWVtVGVtcGxJdGVtTGVmdCwgLm1lbVRlbXBsSXRlbVJpZ2h0LCAubWVtVGVtcGxQYXJhbXMgeworCWJhY2tncm91bmQtY29sb3I6ICNGQUZBRkE7CisJYm9yZGVyOiBub25lOworCW1hcmdpbjogNHB4OworCXBhZGRpbmc6IDFweCAwIDAgOHB4OworfQorCisubWRlc2NMZWZ0LCAubWRlc2NSaWdodCB7CisJcGFkZGluZzogMHB4IDhweCA0cHggOHB4OworCWNvbG9yOiAjNTU1OworfQorCisubWVtSXRlbUxlZnQsIC5tZW1JdGVtUmlnaHQsIC5tZW1UZW1wbFBhcmFtcyB7CisJYm9yZGVyLXRvcDogMXB4IHNvbGlkICNEMEQwRDA7Cit9CisKKy5tZW1JdGVtTGVmdCwgLm1lbVRlbXBsSXRlbUxlZnQgeworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCisubWVtSXRlbVJpZ2h0IHsKKwl3aWR0aDogMTAwJTsKK30KKworLm1lbVRlbXBsUGFyYW1zIHsKKwljb2xvcjogIzY4Njg2ODsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworLyogQGVuZCAqLworCisvKiBAZ3JvdXAgTWVtYmVyIERldGFpbHMgKi8KKworLyogU3R5bGVzIGZvciBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbiAqLworCisubWVtdGVtcGxhdGUgeworCWZvbnQtc2l6ZTogODAlOworCWNvbG9yOiAjNjg2ODY4OworCWZvbnQtd2VpZ2h0OiBub3JtYWw7CisJbWFyZ2luLWxlZnQ6IDlweDsKK30KKworLm1lbW5hdiB7CisJYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKKwlib3JkZXI6IDFweCBzb2xpZCAjQjVCNUI1OworCXRleHQtYWxpZ246IGNlbnRlcjsKKwltYXJnaW46IDJweDsKKwltYXJnaW4tcmlnaHQ6IDE1cHg7CisJcGFkZGluZzogMnB4OworfQorCisubWVtcGFnZSB7CisJd2lkdGg6IDEwMCU7Cit9CisKKy5tZW1pdGVtIHsKKwlwYWRkaW5nOiAwOworCW1hcmdpbi1ib3R0b206IDEwcHg7CisJbWFyZ2luLXJpZ2h0OiA1cHg7CisgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjVzIGxpbmVhcjsKKyAgICAgICAgLW1vei10cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuNXMgbGluZWFyOworICAgICAgICAtbXMtdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjVzIGxpbmVhcjsKKyAgICAgICAgLW8tdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjVzIGxpbmVhcjsKKyAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjVzIGxpbmVhcjsKKyAgICAgICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDsKKyAgICAgICAgd2lkdGg6IDEwMCU7Cit9CisKKy5tZW1pdGVtLmdsb3cgeworICAgICAgICAgYm94LXNoYWRvdzogMCAwIDE1cHggY3lhbjsKK30KKworLm1lbW5hbWUgeworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDZweDsKK30KKworLm1lbW5hbWUgdGQgeworCXZlcnRpY2FsLWFsaWduOiBib3R0b207Cit9CisKKy5tZW1wcm90bywgZGwucmVmbGlzdCBkdCB7CisgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjQjlCOUI5OworICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIHBhZGRpbmc6IDZweCAwcHggNnB4IDBweDsKKyAgICAgICAgY29sb3I6ICMzMjMyMzI7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICB0ZXh0LXNoYWRvdzogMHB4IDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOworICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOnVybCgnbmF2X2YucG5nJyk7CisgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRThFOEU4OworICAgICAgICAvKiBvcGVyYSBzcGVjaWZpYyBtYXJrdXAgKi8KKyAgICAgICAgYm94LXNoYWRvdzogNXB4IDVweCA1cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKKyAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsKKyAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OworICAgICAgICAvKiBmaXJlZm94IHNwZWNpZmljIG1hcmt1cCAqLworICAgICAgICAtbW96LWJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4xNSkgNXB4IDVweCA1cHg7CisgICAgICAgIC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogNHB4OworICAgICAgICAtbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDogNHB4OworICAgICAgICAvKiB3ZWJraXQgc3BlY2lmaWMgbWFya3VwICovCisgICAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogNXB4IDVweCA1cHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKKyAgICAgICAgLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogNHB4OworICAgICAgICAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKKworfQorCisubWVtZG9jLCBkbC5yZWZsaXN0IGRkIHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI0I5QjlCOTsKKyAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI0I5QjlCOTsKKyAgICAgICAgcGFkZGluZzogNnB4IDEwcHggMnB4IDEwcHg7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGQ0ZDRkM7CisgICAgICAgIGJvcmRlci10b3Atd2lkdGg6IDA7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKCduYXZfZy5wbmcnKTsKKyAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7CisgICAgICAgIC8qIG9wZXJhIHNwZWNpZmljIG1hcmt1cCAqLworICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CisgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7CisgICAgICAgIGJveC1zaGFkb3c6IDVweCA1cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7CisgICAgICAgIC8qIGZpcmVmb3ggc3BlY2lmaWMgbWFya3VwICovCisgICAgICAgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiA0cHg7CisgICAgICAgIC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogNHB4OworICAgICAgICAtbW96LWJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4xNSkgNXB4IDVweCA1cHg7CisgICAgICAgIC8qIHdlYmtpdCBzcGVjaWZpYyBtYXJrdXAgKi8KKyAgICAgICAgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7CisgICAgICAgIC13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDRweDsKKyAgICAgICAgLXdlYmtpdC1ib3gtc2hhZG93OiA1cHggNXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTUpOworfQorCitkbC5yZWZsaXN0IGR0IHsKKyAgICAgICAgcGFkZGluZzogNXB4OworfQorCitkbC5yZWZsaXN0IGRkIHsKKyAgICAgICAgbWFyZ2luOiAwcHggMHB4IDEwcHggMHB4OworICAgICAgICBwYWRkaW5nOiA1cHg7Cit9CisKKy5wYXJhbWtleSB7CisJdGV4dC1hbGlnbjogcmlnaHQ7Cit9CisKKy5wYXJhbXR5cGUgeworCXdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKy5wYXJhbW5hbWUgeworCWNvbG9yOiAjNjAyMDIwOworCXdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisucGFyYW1uYW1lIGVtIHsKKwlmb250LXN0eWxlOiBub3JtYWw7Cit9CisucGFyYW1uYW1lIGNvZGUgeworICAgICAgICBsaW5lLWhlaWdodDogMTRweDsKK30KKworLnBhcmFtcywgLnJldHZhbCwgLmV4Y2VwdGlvbiwgLnRwYXJhbXMgeworICAgICAgICBtYXJnaW4tbGVmdDogMHB4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDBweDsKK30KKworLnBhcmFtcyAucGFyYW1uYW1lLCAucmV0dmFsIC5wYXJhbW5hbWUgeworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKK30KKworLnBhcmFtcyAucGFyYW10eXBlIHsKKyAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCisucGFyYW1zIC5wYXJhbWRpciB7CisgICAgICAgIGZvbnQtZmFtaWx5OiAiY291cmllciBuZXciLGNvdXJpZXIsbW9ub3NwYWNlOworICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOworfQorCit0YWJsZS5tbGFiZWxzIHsKKwlib3JkZXItc3BhY2luZzogMHB4OworfQorCit0ZC5tbGFiZWxzLWxlZnQgeworCXdpZHRoOiAxMDAlOworCXBhZGRpbmc6IDBweDsKK30KKwordGQubWxhYmVscy1yaWdodCB7CisJdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKwlwYWRkaW5nOiAwcHg7CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworc3Bhbi5tbGFiZWxzIHsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDsKK30KKworc3Bhbi5tbGFiZWwgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOEY4RjhGOworICAgICAgICBib3JkZXItdG9wOjFweCBzb2xpZCAjNzg3ODc4OworICAgICAgICBib3JkZXItbGVmdDoxcHggc29saWQgIzc4Nzg3ODsKKyAgICAgICAgYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjRDBEMEQwOworICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjRDBEMEQwOworCXRleHQtc2hhZG93OiBub25lOworICAgICAgICBjb2xvcjogd2hpdGU7CisgICAgICAgIG1hcmdpbi1yaWdodDogNHB4OworICAgICAgICBwYWRkaW5nOiAycHggM3B4OworICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgICAgICAgIGZvbnQtc2l6ZTogN3B0OworCXdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKKworCisvKiBAZW5kICovCisKKy8qIHRoZXNlIGFyZSBmb3IgdHJlZSB2aWV3IHdoZW4gbm90IHVzZWQgYXMgbWFpbiBpbmRleCAqLworCitkaXYuZGlyZWN0b3J5IHsKKyAgICAgICAgbWFyZ2luOiAxMHB4IDBweDsKKyAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNBOEI4RDk7CisgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjQThCOEQ5OworICAgICAgICB3aWR0aDogMTAwJTsKK30KKworLmRpcmVjdG9yeSB0YWJsZSB7CisgICAgICAgIGJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsKKyAgICAgICAgd2lkdGg6IDEwMCU7Cit9CisKKy5kaXJlY3RvcnkgdGQgeworICAgICAgICBtYXJnaW46IDBweDsKKyAgICAgICAgcGFkZGluZzogMHB4OworCXZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKKy5kaXJlY3RvcnkgdGQuZW50cnkgeworICAgICAgICB3aWR0aDogMjAlOworICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgICAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7Cit9CisKKy5kaXJlY3RvcnkgdGQuZW50cnkgYSB7CisgICAgICAgIG91dGxpbmU6bm9uZTsKK30KKworLmRpcmVjdG9yeSB0ZC5lbnRyeSBhIGltZyB7CisgICAgICAgIGJvcmRlcjogbm9uZTsKK30KKworLmRpcmVjdG9yeSB0ZC5kZXNjIHsKKyAgICAgICAgd2lkdGg6IDgwJTsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiA2cHg7CisJcGFkZGluZy1yaWdodDogNnB4OworCWJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgwLDAsMCwwLjA1KTsKK30KKworLmRpcmVjdG9yeSB0ci5ldmVuIHsKKwlwYWRkaW5nLWxlZnQ6IDZweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOEY4OworfQorCisuZGlyZWN0b3J5IGltZyB7CisJdmVydGljYWwtYWxpZ246IC0zMCU7Cit9CisKKy5kaXJlY3RvcnkgLmxldmVscyB7CisgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgICAgICAgIHdpZHRoOiAxMDAlOworICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICAgICAgZm9udC1zaXplOiA5cHQ7Cit9CisKKy5kaXJlY3RvcnkgLmxldmVscyBzcGFuIHsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKKyAgICAgICAgcGFkZGluZy1yaWdodDogMnB4OworCWNvbG9yOiAjNTg1ODU4OworfQorCitkaXYuZHluaGVhZGVyIHsKKyAgICAgICAgbWFyZ2luLXRvcDogOHB4OworCS13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKKwktd2Via2l0LXVzZXItc2VsZWN0OiBub25lOworCS1raHRtbC11c2VyLXNlbGVjdDogbm9uZTsKKwktbW96LXVzZXItc2VsZWN0OiBub25lOworCS1tcy11c2VyLXNlbGVjdDogbm9uZTsKKwl1c2VyLXNlbGVjdDogbm9uZTsKK30KKworYWRkcmVzcyB7CisJZm9udC1zdHlsZTogbm9ybWFsOworCWNvbG9yOiAjM0EzQTNBOworfQorCit0YWJsZS5kb3h0YWJsZSB7CisJYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOworICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKK30KKwordGFibGUuZG94dGFibGUgdGQsIHRhYmxlLmRveHRhYmxlIHRoIHsKKwlib3JkZXI6IDFweCBzb2xpZCAjM0YzRjNGOworCXBhZGRpbmc6IDNweCA3cHggMnB4OworfQorCit0YWJsZS5kb3h0YWJsZSB0aCB7CisJYmFja2dyb3VuZC1jb2xvcjogIzRGNEY0RjsKKwljb2xvcjogI0ZGRkZGRjsKKwlmb250LXNpemU6IDExMCU7CisJcGFkZGluZy1ib3R0b206IDRweDsKKwlwYWRkaW5nLXRvcDogNXB4OworfQorCit0YWJsZS5maWVsZHRhYmxlIHsKKyAgICAgICAgd2lkdGg6IDEwMCU7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIGJvcmRlci1zcGFjaW5nOiAwcHg7CisgICAgICAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4OworICAgICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKKyAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OworICAgICAgICAtbW96LWJveC1zaGFkb3c6IHJnYmEoMCwgMCwgMCwgMC4xNSkgMnB4IDJweCAycHg7CisgICAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogMnB4IDJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKKyAgICAgICAgYm94LXNoYWRvdzogMnB4IDJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE1KTsKK30KKworLmZpZWxkdGFibGUgdGQsIC5maWVsZHRhYmxlIHRoIHsKKyAgICAgICAgcGFkZGluZzogM3B4IDdweCAycHg7Cit9CisKKy5maWVsZHRhYmxlIHRkLmZpZWxkdHlwZSwgLmZpZWxkdGFibGUgdGQuZmllbGRuYW1lIHsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI0I5QjlCOTsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKKy5maWVsZHRhYmxlIHRkLmZpZWxkZG9jIHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCOUI5Qjk7CisgICAgICAgIHdpZHRoOiAxMDAlOworfQorCisuZmllbGR0YWJsZSB0cjpsYXN0LWNoaWxkIHRkIHsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKK30KKworLmZpZWxkdGFibGUgdGggeworICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOnVybCgnbmF2X2YucG5nJyk7CisgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRThFOEU4OworICAgICAgICBmb250LXNpemU6IDkwJTsKKyAgICAgICAgY29sb3I6ICMzMjMyMzI7CisgICAgICAgIHBhZGRpbmctYm90dG9tOiA0cHg7CisgICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CisgICAgICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICAgICAgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDRweDsKKyAgICAgICAgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiA0cHg7CisgICAgICAgIC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogNHB4OworICAgICAgICAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiA0cHg7CisgICAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKKyAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNCOUI5Qjk7Cit9CisKKworLnRhYnNlYXJjaCB7CisJdG9wOiAwcHg7CisJbGVmdDogMTBweDsKKwloZWlnaHQ6IDM2cHg7CisJYmFja2dyb3VuZC1pbWFnZTogdXJsKCd0YWJfYi5wbmcnKTsKKwl6LWluZGV4OiAxMDE7CisJb3ZlcmZsb3c6IGhpZGRlbjsKKwlmb250LXNpemU6IDEzcHg7Cit9CisKKy5uYXZwYXRoIHVsCit7CisJZm9udC1zaXplOiAxMXB4OworCWJhY2tncm91bmQtaW1hZ2U6dXJsKCd0YWJfYi5wbmcnKTsKKwliYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsKKwloZWlnaHQ6MzBweDsKKwlsaW5lLWhlaWdodDozMHB4OworCWNvbG9yOiNBMkEyQTI7CisJYm9yZGVyOnNvbGlkIDFweCAjQ0VDRUNFOworCW92ZXJmbG93OmhpZGRlbjsKKwltYXJnaW46MHB4OworCXBhZGRpbmc6MHB4OworfQorCisubmF2cGF0aCBsaQoreworCWxpc3Qtc3R5bGUtdHlwZTpub25lOworCWZsb2F0OmxlZnQ7CisJcGFkZGluZy1sZWZ0OjEwcHg7CisJcGFkZGluZy1yaWdodDoxNXB4OworCWJhY2tncm91bmQtaW1hZ2U6dXJsKCdiY19zLnBuZycpOworCWJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDsKKwliYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0OworCWNvbG9yOiM0RDRENEQ7Cit9CisKKy5uYXZwYXRoIGxpLm5hdmVsZW0gYQoreworCWhlaWdodDozMnB4OworCWRpc3BsYXk6YmxvY2s7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCW91dGxpbmU6IG5vbmU7Cit9CisKKy5uYXZwYXRoIGxpLm5hdmVsZW0gYTpob3ZlcgoreworCWNvbG9yOiM4ODg4ODg7Cit9CisKKy5uYXZwYXRoIGxpLmZvb3RlcgoreworICAgICAgICBsaXN0LXN0eWxlLXR5cGU6bm9uZTsKKyAgICAgICAgZmxvYXQ6cmlnaHQ7CisgICAgICAgIHBhZGRpbmctbGVmdDoxMHB4OworICAgICAgICBwYWRkaW5nLXJpZ2h0OjE1cHg7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsKKyAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0OworICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0OworICAgICAgICBjb2xvcjojNEQ0RDREOworICAgICAgICBmb250LXNpemU6IDhwdDsKK30KKworCitkaXYuc3VtbWFyeQoreworCWZsb2F0OiByaWdodDsKKwlmb250LXNpemU6IDhwdDsKKwlwYWRkaW5nLXJpZ2h0OiA1cHg7CisJd2lkdGg6IDUwJTsKKwl0ZXh0LWFsaWduOiByaWdodDsKK30KKworZGl2LnN1bW1hcnkgYQoreworCXdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKK2Rpdi5pbmdyb3VwcworeworCWZvbnQtc2l6ZTogOHB0OworCXdpZHRoOiA1MCU7CisJdGV4dC1hbGlnbjogbGVmdDsKK30KKworZGl2LmluZ3JvdXBzIGEKK3sKKwl3aGl0ZS1zcGFjZTogbm93cmFwOworfQorCitkaXYuaGVhZGVyCit7CisgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKCduYXZfaC5wbmcnKTsKKyAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZBRkFGQTsKKwltYXJnaW46ICAwcHg7CisJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNEMEQwRDA7Cit9CisKK2Rpdi5oZWFkZXJ0aXRsZQoreworCXBhZGRpbmc6IDVweCA1cHggNXB4IDdweDsKK30KKworZGwKK3sKKyAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKK30KKworLyogZGwubm90ZSwgZGwud2FybmluZywgZGwuYXR0ZW50aW9uLCBkbC5wcmUsIGRsLnBvc3QsIGRsLmludmFyaWFudCwgZGwuZGVwcmVjYXRlZCwgZGwudG9kbywgZGwudGVzdCwgZGwuYnVnICovCitkbC5zZWN0aW9uCit7CisJbWFyZ2luLWxlZnQ6IDBweDsKKwlwYWRkaW5nLWxlZnQ6IDBweDsKK30KKworZGwubm90ZQoreworICAgICAgICBtYXJnaW4tbGVmdDotN3B4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkOworICAgICAgICBib3JkZXItY29sb3I6ICNEMEMwMDA7Cit9CisKK2RsLndhcm5pbmcsIGRsLmF0dGVudGlvbgoreworICAgICAgICBtYXJnaW4tbGVmdDotN3B4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkOworICAgICAgICBib3JkZXItY29sb3I6ICNGRjAwMDA7Cit9CisKK2RsLnByZSwgZGwucG9zdCwgZGwuaW52YXJpYW50Cit7CisgICAgICAgIG1hcmdpbi1sZWZ0Oi03cHg7CisgICAgICAgIHBhZGRpbmctbGVmdDogM3B4OworICAgICAgICBib3JkZXItbGVmdDo0cHggc29saWQ7CisgICAgICAgIGJvcmRlci1jb2xvcjogIzAwRDAwMDsKK30KKworZGwuZGVwcmVjYXRlZAoreworICAgICAgICBtYXJnaW4tbGVmdDotN3B4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkOworICAgICAgICBib3JkZXItY29sb3I6ICM1MDUwNTA7Cit9CisKK2RsLnRvZG8KK3sKKyAgICAgICAgbWFyZ2luLWxlZnQ6LTdweDsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CisgICAgICAgIGJvcmRlcjo0cHggc29saWQ7CisgICAgICAgIGJvcmRlci1jb2xvcjogIzAwQzBFMDsKK30KKworZGwudGVzdAoreworICAgICAgICBtYXJnaW4tbGVmdDotN3B4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkOworICAgICAgICBib3JkZXItY29sb3I6ICMzMDMwRTA7Cit9CisKK2RsLmJ1ZworeworICAgICAgICBtYXJnaW4tbGVmdDotN3B4OworICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgICAgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkOworICAgICAgICBib3JkZXItY29sb3I6ICNDMDgwNTA7Cit9CisKK2RsLnNlY3Rpb24gZGQgeworCW1hcmdpbi1ib3R0b206IDZweDsKK30KKworCisjcHJvamVjdGxvZ28KK3sKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisJdmVydGljYWwtYWxpZ246IGJvdHRvbTsKKwlib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOworfQorCisjcHJvamVjdGxvZ28gaW1nCit7CisJYm9yZGVyOiAwcHggbm9uZTsKK30KKworI3Byb2plY3RuYW1lCit7CisJZm9udDogMzAwJSBUYWhvbWEsIEFyaWFsLHNhbnMtc2VyaWY7CisJbWFyZ2luOiAwcHg7CisJcGFkZGluZzogMnB4IDBweDsKK30KKworI3Byb2plY3RicmllZgoreworCWZvbnQ6IDEyMCUgVGFob21hLCBBcmlhbCxzYW5zLXNlcmlmOworCW1hcmdpbjogMHB4OworCXBhZGRpbmc6IDBweDsKK30KKworI3Byb2plY3RudW1iZXIKK3sKKwlmb250OiA1MCUgVGFob21hLCBBcmlhbCxzYW5zLXNlcmlmOworCW1hcmdpbjogMHB4OworCXBhZGRpbmc6IDBweDsKK30KKworI3RpdGxlYXJlYQoreworCXBhZGRpbmc6IDBweDsKKwltYXJnaW46IDBweDsKKwl3aWR0aDogMTAwJTsKKwlib3JkZXItYm90dG9tOiAxcHggc29saWQgIzc4Nzg3ODsKK30KKworLmltYWdlCit7CisgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLmRvdGdyYXBoCit7CisgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLm1zY2dyYXBoCit7CisgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKworLmNhcHRpb24KK3sKKwlmb250LXdlaWdodDogYm9sZDsKK30KKworZGl2Lnpvb20KK3sKKwlib3JkZXI6IDFweCBzb2xpZCAjQTZBNkE2OworfQorCitkbC5jaXRlbGlzdCB7CisgICAgICAgIG1hcmdpbi1ib3R0b206NTBweDsKK30KKworZGwuY2l0ZWxpc3QgZHQgeworICAgICAgICBjb2xvcjojNDg0ODQ4OworICAgICAgICBmbG9hdDpsZWZ0OworICAgICAgICBmb250LXdlaWdodDpib2xkOworICAgICAgICBtYXJnaW4tcmlnaHQ6MTBweDsKKyAgICAgICAgcGFkZGluZzo1cHg7Cit9CisKK2RsLmNpdGVsaXN0IGRkIHsKKyAgICAgICAgbWFyZ2luOjJweCAwOworICAgICAgICBwYWRkaW5nOjVweCAwOworfQorCitkaXYudG9jIHsKKyAgICAgICAgcGFkZGluZzogMTRweCAyNXB4OworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjZGNkY2OworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjREZERkRGOworICAgICAgICBib3JkZXItcmFkaXVzOiA3cHggN3B4IDdweCA3cHg7CisgICAgICAgIGZsb2F0OiByaWdodDsKKyAgICAgICAgaGVpZ2h0OiBhdXRvOworICAgICAgICBtYXJnaW46IDAgMjBweCAxMHB4IDEwcHg7CisgICAgICAgIHdpZHRoOiAyMDBweDsKK30KKworZGl2LnRvYyBsaSB7CisgICAgICAgIGJhY2tncm91bmQ6IHVybCgiYmR3bi5wbmciKSBuby1yZXBlYXQgc2Nyb2xsIDAgNXB4IHRyYW5zcGFyZW50OworICAgICAgICBmb250OiAxMHB4LzEuMiBWZXJkYW5hLERlamFWdSBTYW5zLEdlbmV2YSxzYW5zLXNlcmlmOworICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CisgICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKKyAgICAgICAgcGFkZGluZy10b3A6IDJweDsKK30KKworZGl2LnRvYyBoMyB7CisgICAgICAgIGZvbnQ6IGJvbGQgMTJweC8xLjIgQXJpYWwsRnJlZVNhbnMsc2Fucy1zZXJpZjsKKwljb2xvcjogIzY4Njg2ODsKKyAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBub25lOworICAgICAgICBtYXJnaW46IDA7Cit9CisKK2Rpdi50b2MgdWwgeworICAgICAgICBsaXN0LXN0eWxlOiBub25lIG91dHNpZGUgbm9uZTsKKyAgICAgICAgYm9yZGVyOiBtZWRpdW0gbm9uZTsKKyAgICAgICAgcGFkZGluZzogMHB4OworfQorCitkaXYudG9jIGxpLmxldmVsMSB7CisgICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7Cit9CisKK2Rpdi50b2MgbGkubGV2ZWwyIHsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHg7Cit9CisKK2Rpdi50b2MgbGkubGV2ZWwzIHsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDMwcHg7Cit9CisKK2Rpdi50b2MgbGkubGV2ZWw0IHsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDQ1cHg7Cit9CisKKy5pbmhlcml0X2hlYWRlciB7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgICBjb2xvcjogZ3JheTsKKyAgICAgICAgY3Vyc29yOiBwb2ludGVyOworCS13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKKwktd2Via2l0LXVzZXItc2VsZWN0OiBub25lOworCS1raHRtbC11c2VyLXNlbGVjdDogbm9uZTsKKwktbW96LXVzZXItc2VsZWN0OiBub25lOworCS1tcy11c2VyLXNlbGVjdDogbm9uZTsKKwl1c2VyLXNlbGVjdDogbm9uZTsKK30KKworLmluaGVyaXRfaGVhZGVyIHRkIHsKKyAgICAgICAgcGFkZGluZzogNnB4IDBweCAycHggNXB4OworfQorCisuaW5oZXJpdCB7CisgICAgICAgIGRpc3BsYXk6IG5vbmU7Cit9CisKK3RyLmhlYWRpbmcgaDIgeworICAgICAgICBtYXJnaW4tdG9wOiAxMnB4OworICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7Cit9CisKK0BtZWRpYSBwcmludAoreworICAjdG9wIHsgZGlzcGxheTogbm9uZTsgfQorICAjc2lkZS1uYXYgeyBkaXNwbGF5OiBub25lOyB9CisgICNuYXYtcGF0aCB7IGRpc3BsYXk6IG5vbmU7IH0KKyAgYm9keSB7IG92ZXJmbG93OnZpc2libGU7IH0KKyAgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7IHBhZ2UtYnJlYWstYWZ0ZXI6IGF2b2lkOyB9CisgIC5zdW1tYXJ5IHsgZGlzcGxheTogbm9uZTsgfQorICAubWVtaXRlbSB7IHBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDsgfQorICAjZG9jLWNvbnRlbnQKKyAgeworICAgIG1hcmdpbi1sZWZ0OjAgIWltcG9ydGFudDsKKyAgICBoZWlnaHQ6YXV0byAhaW1wb3J0YW50OworICAgIHdpZHRoOmF1dG8gIWltcG9ydGFudDsKKyAgICBvdmVyZmxvdzppbmhlcml0OworICAgIGRpc3BsYXk6aW5saW5lOworICB9Cit9CmRpZmYgLS1naXQgYS9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL2ZvdW5kYXRpb24uY3NzIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9mb3VuZGF0aW9uLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjEzMzBlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9mb3VuZGF0aW9uLmNzcwpAQCAtMCwwICsxLDc4OCBAQAorLmMtMSwgLmMtMiwgLmMtMywgLmMtNCwgLmMtNSwgLmMtNiwgLmMtNywgLmMtOCwgLmMtOSwgLmMtMTAsIC5jLTExLCAuYy0xMiB7IGZsb2F0OiBsZWZ0OyB9CisKKy5jLTEsIC5jLTIsIC5jLTMsIC5jLTQsIC5jLTUsIC5jLTYsIC5jLTcsIC5jLTgsIC5jLTksIC5jLTEwLCAuYy0xMSwgLmMtMTIgeyBwb3NpdGlvbjogcmVsYXRpdmU7IG1pbi1oZWlnaHQ6IDFweDsgcGFkZGluZzogMCAxNXB4OyB9CisKKy5jLTEgeyB3aWR0aDogOC4zMzMzMyU7IH0KKworLmMtMiB7IHdpZHRoOiAxNi42NjY2NyU7IH0KKworLmMtMyB7IHdpZHRoOiAyNSU7IH0KKworLmMtNCB7IHdpZHRoOiAzMy4zMzMzMyU7IH0KKworLmMtNSB7IHdpZHRoOiA0MS42NjY2NyU7IH0KKworLmMtNiB7IHdpZHRoOiA1MCU7IH0KKworLmMtNyB7IHdpZHRoOiA1OC4zMzMzMyU7IH0KKworLmMtOCB7IHdpZHRoOiA2Ni42NjY2NyU7IH0KKworLmMtOSB7IHdpZHRoOiA3NSU7IH0KKworLmMtMTAgeyB3aWR0aDogODMuMzMzMzMlOyB9CisKKy5jLTExIHsgd2lkdGg6IDkxLjY2NjY3JTsgfQorCisuYy0xMiB7IHdpZHRoOiAxMDAlOyB9CisKKy8qIFJlcXVpcmVzOiBub3JtYWxpemUuY3NzICovCisvKiBHbG9iYWwgUmVzZXQgJiBTdGFuZGFyZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworKiB7IC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDsgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CisKK2h0bWwgeyBmb250LXNpemU6IDYyLjUlOyB9CisKK2JvZHkgeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsICJIZWx2ZXRpY2EiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxOyBjb2xvcjogIzIyMjIyMjsgcG9zaXRpb246IHJlbGF0aXZlOyAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsgfQorCisvKiBMaW5rcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCithIHsgY29sb3I6ICNmZDc4MDA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH0KKworYTpob3ZlciB7IGNvbG9yOiAjMjc5NWI2OyB9CisKK2E6Zm9jdXMgeyBjb2xvcjogI2ZkNzgwMDsgb3V0bGluZTogbm9uZTsgfQorCitwIGEsIHAgYTp2aXNpdGVkIHsgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH0KKworLyogTWlzYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisubGVmdCB7IGZsb2F0OiBsZWZ0OyB9CitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IC5sZWZ0IHsgZmxvYXQ6IG5vbmU7IH0gfQorCisucmlnaHQgeyBmbG9hdDogcmlnaHQ7IH0KK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsgLnJpZ2h0IHsgZmxvYXQ6IG5vbmU7IH0gfQorCisudGV4dC1sZWZ0IHsgdGV4dC1hbGlnbjogbGVmdDsgfQorCisudGV4dC1yaWdodCB7IHRleHQtYWxpZ246IHJpZ2h0OyB9CisKKy50ZXh0LWNlbnRlciB7IHRleHQtYWxpZ246IGNlbnRlcjsgfQorCisuaGlkZSB7IGRpc3BsYXk6IG5vbmU7IH0KKworLmhpZ2hsaWdodCB7IGJhY2tncm91bmQ6ICNmZmZmOTk7IH0KKworI2dvb2dsZW1hcCBpbWcsIG9iamVjdCwgZW1iZWQgeyBtYXgtd2lkdGg6IG5vbmU7IH0KKworI21hcF9jYW52YXMgZW1iZWQgeyBtYXgtd2lkdGg6IG5vbmU7IH0KKworI21hcF9jYW52YXMgaW1nIHsgbWF4LXdpZHRoOiBub25lOyB9CisKKyNtYXBfY2FudmFzIG9iamVjdCB7IG1heC13aWR0aDogbm9uZTsgfQorCisvKiBSZXNldCBmb3Igc3RyYW5nZSBtYXJnaW5zIGJ5IGRlZmF1bHQgb24gPGZpZ3VyZT4gZWxlbWVudHMgKi8KK2ZpZ3VyZSB7IG1hcmdpbjogMDsgfQorCisvKiBCYXNlIFR5cGUgU3R5bGVzIFVzaW5nIE1vZHVsYXIgU2NhbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworYm9keSwgZGl2LCBkbCwgZHQsIGRkLCB1bCwgb2wsIGxpLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBwcmUsIGZvcm0sIHAsIGJsb2NrcXVvdGUsIHRoLCB0ZCB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgZm9udC1zaXplOiAxNHB4OyBkaXJlY3Rpb246IGx0cjsgfQorCitwIHsgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsICJIZWx2ZXRpY2EiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxLjY7IG1hcmdpbi1ib3R0b206IDE3cHg7IH0KK3AubGVhZCB7IGZvbnQtc2l6ZTogMTcuNXB4OyBsaW5lLWhlaWdodDogMS42OyBtYXJnaW4tYm90dG9tOiAxN3B4OyB9CisKK2FzaWRlIHAgeyBmb250LXNpemU6IDEzcHg7IGxpbmUtaGVpZ2h0OiAxLjM1OyBmb250LXN0eWxlOiBpdGFsaWM7IH0KKworaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7IGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCAiSGVsdmV0aWNhIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjMjIyMjIyOyB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OyBsaW5lLWhlaWdodDogMS4wOyBtYXJnaW4tYm90dG9tOiAxNHB4OyBtYXJnaW4tdG9wOiAxNHB4OyB9CitoMSBzbWFsbCwgaDIgc21hbGwsIGgzIHNtYWxsLCBoNCBzbWFsbCwgaDUgc21hbGwsIGg2IHNtYWxsIHsgZm9udC1zaXplOiA2MCU7IGNvbG9yOiAjNmY2ZjZmOyBsaW5lLWhlaWdodDogMDsgfQorCitoMSB7IGZvbnQtc2l6ZTogMjRweDsgfQorCitoMiB7IGZvbnQtc2l6ZTogMThweDsgfQorCitoMyB7IGZvbnQtc2l6ZTogMTRweDsgfQorCitoNCB7IGZvbnQtc2l6ZTogMTJweDsgfQorCitoNSB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDEycHg7IH0KKworaDYgeyBmb250LXN0eWxlOiBpdGFsaWM7IGZvbnQtc2l6ZTogMTJweDsgfQorCitociB7IGJvcmRlcjogc29saWQgI2M2YzZjNjsgYm9yZGVyLXdpZHRoOiAxcHggMCAwOyBjbGVhcjogYm90aDsgbWFyZ2luOiAyMnB4IDAgMjFweDsgaGVpZ2h0OiAwOyB9CisKKy5zdWJoZWFkZXIgeyBsaW5lLWhlaWdodDogMS4zOyBjb2xvcjogIzZmNmY2ZjsgZm9udC13ZWlnaHQ6IDMwMDsgbWFyZ2luLWJvdHRvbTogMTdweDsgfQorCitlbSwgaSB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH0KKworc3Ryb25nLCBiIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGxpbmUtaGVpZ2h0OiBpbmhlcml0OyB9CisKK3NtYWxsIHsgZm9udC1zaXplOiA2MCU7IGxpbmUtaGVpZ2h0OiBpbmhlcml0OyB9CisKK2NvZGUgeyBmb250LXdlaWdodDogYm9sZDsgYmFja2dyb3VuZDogI2ZmZmY5OTsgfQorCisvKiBMaXN0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit1bCwgb2wgeyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxLjY7IG1hcmdpbi1ib3R0b206IDE3cHg7IGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsgfQorCit1bCBsaSB1bCwgdWwgbGkgb2wgeyBtYXJnaW4tbGVmdDogMjBweDsgbWFyZ2luLWJvdHRvbTogMDsgfQordWwuc3F1YXJlLCB1bC5jaXJjbGUsIHVsLmRpc2MgeyBtYXJnaW4tbGVmdDogMTdweDsgfQordWwuc3F1YXJlIHsgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7IH0KK3VsLnNxdWFyZSBsaSB1bCB7IGxpc3Qtc3R5bGU6IGluaGVyaXQ7IH0KK3VsLmNpcmNsZSB7IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyB9Cit1bC5jaXJjbGUgbGkgdWwgeyBsaXN0LXN0eWxlOiBpbmhlcml0OyB9Cit1bC5kaXNjIHsgbGlzdC1zdHlsZS10eXBlOiBkaXNjOyB9Cit1bC5kaXNjIGxpIHVsIHsgbGlzdC1zdHlsZTogaW5oZXJpdDsgfQordWwubm8tYnVsbGV0IHsgbGlzdC1zdHlsZTogbm9uZTsgfQordWwubGFyZ2UgbGkgeyBsaW5lLWhlaWdodDogMjFweDsgfQorCitvbCBsaSB1bCwgb2wgbGkgb2wgeyBtYXJnaW4tbGVmdDogMjBweDsgbWFyZ2luLWJvdHRvbTogMDsgfQorCisvKiBCbG9ja3F1b3RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitibG9ja3F1b3RlLCBibG9ja3F1b3RlIHAgeyBsaW5lLWhlaWdodDogMS41OyB9CisKK2Jsb2NrcXVvdGUgeyBtYXJnaW46IDAgMCAxN3B4OyBwYWRkaW5nOiA5cHggMjBweCAwIDE5cHg7IH0KK2Jsb2NrcXVvdGUgY2l0ZSB7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDEzcHQ7IGNvbG9yOiAjNTU1NTU1OyB9CitibG9ja3F1b3RlIGNpdGU6YmVmb3JlIHsgY29udGVudDogIlwyMDE0IFwwMDIwIjsgfQorYmxvY2txdW90ZSBjaXRlIGEsIGJsb2NrcXVvdGUgY2l0ZSBhOnZpc2l0ZWQgeyBjb2xvcjogIzU1NTU1NTsgfQorCithYmJyLCBhY3JvbnltIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgZm9udC1zaXplOiA5MCU7IGNvbG9yOiAjMjIyMjIyOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDsgY3Vyc29yOiBoZWxwOyB9CisKK2FiYnIgeyB0ZXh0LXRyYW5zZm9ybTogbm9uZTsgfQorCisvKiBQcmludCBzdHlsZXMuICBJbmxpbmVkIHRvIGF2b2lkIHJlcXVpcmVkIEhUVFAgY29ubmVjdGlvbjogd3d3LnBocGllZC5jb20vZGVsYXktbG9hZGluZy15b3VyLXByaW50LWNzcy8gQ3JlZGl0IHRvIFBhdWwgSXJpc2ggYW5kIEhUTUw1IEJvaWxlcnBsYXRlIChodG1sNWJvaWxlcnBsYXRlLmNvbSkKKyovCisucHJpbnQtb25seSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQorCitAbWVkaWEgcHJpbnQgeyAqIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7IGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsgdGV4dC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsgZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7IC1tcy1maWx0ZXI6IG5vbmUgIWltcG9ydGFudDsgfQorICAvKiBCbGFjayBwcmludHMgZmFzdGVyOiBoNWJwLmNvbS9zICovCisgIGEsIGE6dmlzaXRlZCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CisgIGFbaHJlZl06YWZ0ZXIgeyBjb250ZW50OiAiICgiIGF0dHIoaHJlZikgIikiOyB9CisgIGFiYnJbdGl0bGVdOmFmdGVyIHsgY29udGVudDogIiAoIiBhdHRyKHRpdGxlKSAiKSI7IH0KKyAgLmlyIGE6YWZ0ZXIsIGFbaHJlZl49ImphdmFzY3JpcHQ6Il06YWZ0ZXIsIGFbaHJlZl49IiMiXTphZnRlciB7IGNvbnRlbnQ6ICIiOyB9CisgIC8qIERvbid0IHNob3cgbGlua3MgZm9yIGltYWdlcywgb3IgamF2YXNjcmlwdC9pbnRlcm5hbCBsaW5rcyAqLworICBwcmUsIGJsb2NrcXVvdGUgeyBib3JkZXI6IDFweCBzb2xpZCAjOTk5OyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0KKyAgdGhlYWQgeyBkaXNwbGF5OiB0YWJsZS1oZWFkZXItZ3JvdXA7IH0KKyAgLyogaDVicC5jb20vdCAqLworICB0ciwgaW1nIHsgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOyB9CisgIGltZyB7IG1heC13aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIEBwYWdlIHsgbWFyZ2luOiAwLjVjbTsgfQorICBwLCBoMiwgaDMgeyBvcnBoYW5zOiAzOyB3aWRvd3M6IDM7IH0KKyAgaDIsIGgzIHsgcGFnZS1icmVhay1hZnRlcjogYXZvaWQ7IH0KKyAgLmhpZGUtb24tcHJpbnQgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KKyAgLnByaW50LW9ubHkgeyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9IH0KKy8qIFJlcXVpcmVzIGdsb2JhbHMuY3NzICovCisvKiBTdGFuZGFyZCBGb3JtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitmb3JtIHsgbWFyZ2luOiAwIDAgMTkuNDE2NDFweDsgfQorCisucm93IGZvcm0gLnJvdyB7IG1hcmdpbjogMCAtNnB4OyB9Cisucm93IGZvcm0gLnJvdyAuY29sdW1uLCAucm93IGZvcm0gLnJvdyAuY29sdW1ucyB7IHBhZGRpbmc6IDAgNnB4OyB9Cisucm93IGZvcm0gLnJvdy5jb2xsYXBzZSB7IG1hcmdpbjogMDsgfQorLnJvdyBmb3JtIC5yb3cuY29sbGFwc2UgLmNvbHVtbiwgLnJvdyBmb3JtIC5yb3cuY29sbGFwc2UgLmNvbHVtbnMgeyBwYWRkaW5nOiAwOyB9CisKK2xhYmVsIHsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogIzRkNGQ0ZDsgY3Vyc29yOiBwb2ludGVyOyBkaXNwbGF5OiBibG9jazsgZm9udC13ZWlnaHQ6IDUwMDsgbWFyZ2luLWJvdHRvbTogM3B4OyB9CitsYWJlbC5yaWdodCB7IGZsb2F0OiBub25lOyB0ZXh0LWFsaWduOiByaWdodDsgfQorbGFiZWwuaW5saW5lIHsgbGluZS1oZWlnaHQ6IDMycHg7IG1hcmdpbjogMCAwIDEycHggMDsgfQorCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IGxhYmVsLnJpZ2h0IHsgdGV4dC1hbGlnbjogbGVmdDsgfSB9CisucHJlZml4LCAucG9zdGZpeCB7IGRpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogcmVsYXRpdmU7IHotaW5kZXg6IDI7IHRleHQtYWxpZ246IGNlbnRlcjsgd2lkdGg6IDEwMCU7IHBhZGRpbmctdG9wOiAwOyBwYWRkaW5nLWJvdHRvbTogMDsgaGVpZ2h0OiAzMnB4OyBsaW5lLWhlaWdodDogMzFweDsgfQorCithLmJ1dHRvbi5wcmVmaXgsIGEuYnV0dG9uLnBvc3RmaXggeyBwYWRkaW5nLWxlZnQ6IDA7IHBhZGRpbmctcmlnaHQ6IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgfQorCitzcGFuLnByZWZpeCwgc3Bhbi5wb3N0Zml4IHsgYmFja2dyb3VuZDogI2YyZjJmMjsgYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsgfQorCisucHJlZml4IHsgbGVmdDogMnB4OyAtbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDogMnB4OyAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDsgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMnB4OyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDogMnB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OyBvdmVyZmxvdzogaGlkZGVuOyB9CisKKy5wb3N0Zml4IHsgcmlnaHQ6IDJweDsgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiAycHg7IC13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDJweDsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OiAycHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsgfQorCitpbnB1dFt0eXBlPSJ0ZXh0Il0sIGlucHV0W3R5cGU9InBhc3N3b3JkIl0sIGlucHV0W3R5cGU9ImRhdGUiXSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXSwgaW5wdXRbdHlwZT0iZW1haWwiXSwgaW5wdXRbdHlwZT0ibnVtYmVyIl0sIGlucHV0W3R5cGU9InNlYXJjaCJdLCBpbnB1dFt0eXBlPSJ0ZWwiXSwgaW5wdXRbdHlwZT0idGltZSJdLCBpbnB1dFt0eXBlPSJ1cmwiXSwgdGV4dGFyZWEgeyBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgIkhlbHZldGljYSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7IGJvcmRlcjogMXB4IHNvbGlkICNjY2NjY2M7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDJweDsgLW1zLWJvcmRlci1yYWRpdXM6IDJweDsgLW8tYm9yZGVyLXJhZGl1czogMnB4OyBib3JkZXItcmFkaXVzOiAycHg7IC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKTsgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpOyBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpOyBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjc1KTsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMTRweDsgbWFyZ2luOiAwIDAgMTJweCAwOyBwYWRkaW5nOiA2cHg7IGhlaWdodDogMzJweDsgd2lkdGg6IDEwMCU7IC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMTVzIGxpbmVhcjsgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4xNXMgbGluZWFyOyAtby10cmFuc2l0aW9uOiBhbGwgMC4xNXMgbGluZWFyOyB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgbGluZWFyOyB9CitpbnB1dFt0eXBlPSJ0ZXh0Il0ub3ZlcnNpemUsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0ub3ZlcnNpemUsIGlucHV0W3R5cGU9ImRhdGUiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0iZW1haWwiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0ibnVtYmVyIl0ub3ZlcnNpemUsIGlucHV0W3R5cGU9InNlYXJjaCJdLm92ZXJzaXplLCBpbnB1dFt0eXBlPSJ0ZWwiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0idGltZSJdLm92ZXJzaXplLCBpbnB1dFt0eXBlPSJ1cmwiXS5vdmVyc2l6ZSwgdGV4dGFyZWEub3ZlcnNpemUgeyBmb250LXNpemU6IDE3cHg7IHBhZGRpbmc6IDRweCA2cHg7IH0KK2lucHV0W3R5cGU9InRleHQiXTpmb2N1cywgaW5wdXRbdHlwZT0icGFzc3dvcmQiXTpmb2N1cywgaW5wdXRbdHlwZT0iZGF0ZSJdOmZvY3VzLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdOmZvY3VzLCBpbnB1dFt0eXBlPSJlbWFpbCJdOmZvY3VzLCBpbnB1dFt0eXBlPSJudW1iZXIiXTpmb2N1cywgaW5wdXRbdHlwZT0ic2VhcmNoIl06Zm9jdXMsIGlucHV0W3R5cGU9InRlbCJdOmZvY3VzLCBpbnB1dFt0eXBlPSJ0aW1lIl06Zm9jdXMsIGlucHV0W3R5cGU9InVybCJdOmZvY3VzLCB0ZXh0YXJlYTpmb2N1cyB7IGJhY2tncm91bmQ6ICNmYWZhZmE7IG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDsgYm9yZGVyLWNvbG9yOiAjYjNiM2IzOyB9CitpbnB1dFt0eXBlPSJ0ZXh0Il1bZGlzYWJsZWRdLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdW2Rpc2FibGVkXSwgaW5wdXRbdHlwZT0iZGF0ZSJdW2Rpc2FibGVkXSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXVtkaXNhYmxlZF0sIGlucHV0W3R5cGU9ImVtYWlsIl1bZGlzYWJsZWRdLCBpbnB1dFt0eXBlPSJudW1iZXIiXVtkaXNhYmxlZF0sIGlucHV0W3R5cGU9InNlYXJjaCJdW2Rpc2FibGVkXSwgaW5wdXRbdHlwZT0idGVsIl1bZGlzYWJsZWRdLCBpbnB1dFt0eXBlPSJ0aW1lIl1bZGlzYWJsZWRdLCBpbnB1dFt0eXBlPSJ1cmwiXVtkaXNhYmxlZF0sIHRleHRhcmVhW2Rpc2FibGVkXSB7IGJhY2tncm91bmQtY29sb3I6ICNkZGQ7IH0KKwordGV4dGFyZWEgeyBoZWlnaHQ6IGF1dG87IH0KKworc2VsZWN0IHsgd2lkdGg6IDEwMCU7IH0KKworLyogRmllbGRzZXRzICovCitmaWVsZHNldCB7IGJvcmRlcjogc29saWQgMXB4ICNkZGQ7IGJvcmRlci1yYWRpdXM6IDNweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7IC1tb3otYm9yZGVyLXJhZGl1czogM3B4OyBwYWRkaW5nOiAxMnB4IDEycHggMDsgbWFyZ2luOiAxOHB4IDA7IH0KK2ZpZWxkc2V0IGxlZ2VuZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBiYWNrZ3JvdW5kOiB3aGl0ZTsgcGFkZGluZzogMCAzcHg7IG1hcmdpbjogMDsgbWFyZ2luLWxlZnQ6IC0zcHg7IH0KKworLyogRXJyb3JzICovCisuZXJyb3IgaW5wdXQsIGlucHV0LmVycm9yLCAuZXJyb3IgdGV4dGFyZWEsIHRleHRhcmVhLmVycm9yIHsgYm9yZGVyLWNvbG9yOiAjYzYwZjEzOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE5OCwgMTUsIDE5LCAwLjEpOyB9CisKKy5lcnJvciBsYWJlbCwgbGFiZWwuZXJyb3IgeyBjb2xvcjogI2M2MGYxMzsgfQorCisuZXJyb3Igc21hbGwsIHNtYWxsLmVycm9yIHsgZGlzcGxheTogYmxvY2s7IHBhZGRpbmc6IDZweCA0cHg7IG1hcmdpbi10b3A6IC0xM3B4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBiYWNrZ3JvdW5kOiAjYzYwZjEzOyBjb2xvcjogI2ZmZjsgZm9udC1zaXplOiAxMnB4OyBmb250LXNpemU6IDEuMnJlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiAycHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogMnB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7IH0KKworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyBpbnB1dFt0eXBlPSJ0ZXh0Il0ub25lLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLm9uZSwgaW5wdXRbdHlwZT0iZGF0ZSJdLm9uZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5vbmUsIGlucHV0W3R5cGU9ImVtYWlsIl0ub25lLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5vbmUsIGlucHV0W3R5cGU9InNlYXJjaCJdLm9uZSwgaW5wdXRbdHlwZT0idGVsIl0ub25lLCBpbnB1dFt0eXBlPSJ0aW1lIl0ub25lLCBpbnB1dFt0eXBlPSJ1cmwiXS5vbmUsIHRleHRhcmVhLm9uZSwgLnJvdyB0ZXh0YXJlYS5vbmUgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnR3bywgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50d28sIGlucHV0W3R5cGU9ImRhdGUiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLnR3bywgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50d28sIGlucHV0W3R5cGU9ImVtYWlsIl0udHdvLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0udHdvLCBpbnB1dFt0eXBlPSJudW1iZXIiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0udHdvLCBpbnB1dFt0eXBlPSJzZWFyY2giXS50d28sIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0udHdvLCBpbnB1dFt0eXBlPSJ0ZWwiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0udHdvLCBpbnB1dFt0eXBlPSJ0aW1lIl0udHdvLCAucm93IGlucHV0W3R5cGU9InRpbWUiXS50d28sIGlucHV0W3R5cGU9InVybCJdLnR3bywgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS50d28sIHRleHRhcmVhLnR3bywgLnJvdyB0ZXh0YXJlYS50d28geyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJ0ZXh0Il0udGhyZWUsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0udGhyZWUsIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50aHJlZSwgaW5wdXRbdHlwZT0iZGF0ZSJdLnRocmVlLCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS50aHJlZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJkYXRldGltZSJdLnRocmVlLCBpbnB1dFt0eXBlPSJlbWFpbCJdLnRocmVlLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0udGhyZWUsIGlucHV0W3R5cGU9Im51bWJlciJdLnRocmVlLCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLnRocmVlLCBpbnB1dFt0eXBlPSJzZWFyY2giXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJzZWFyY2giXS50aHJlZSwgaW5wdXRbdHlwZT0idGVsIl0udGhyZWUsIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0udGhyZWUsIGlucHV0W3R5cGU9InRpbWUiXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0udGhyZWUsIGlucHV0W3R5cGU9InVybCJdLnRocmVlLCAucm93IGlucHV0W3R5cGU9InVybCJdLnRocmVlLCB0ZXh0YXJlYS50aHJlZSwgLnJvdyB0ZXh0YXJlYS50aHJlZSB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KKyAgaW5wdXRbdHlwZT0idGV4dCJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLmZvdXIsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmZvdXIsIGlucHV0W3R5cGU9ImRhdGUiXS5mb3VyLCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS5mb3VyLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5mb3VyLCBpbnB1dFt0eXBlPSJlbWFpbCJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5mb3VyLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5mb3VyLCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLmZvdXIsIGlucHV0W3R5cGU9InNlYXJjaCJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0uZm91ciwgaW5wdXRbdHlwZT0idGVsIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5mb3VyLCBpbnB1dFt0eXBlPSJ0aW1lIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uZm91ciwgaW5wdXRbdHlwZT0idXJsIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5mb3VyLCB0ZXh0YXJlYS5mb3VyLCAucm93IHRleHRhcmVhLmZvdXIgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS5maXZlLCAucm93IGlucHV0W3R5cGU9InRleHQiXS5maXZlLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5maXZlLCBpbnB1dFt0eXBlPSJkYXRlIl0uZml2ZSwgLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0uZml2ZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5maXZlLCAucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uZml2ZSwgaW5wdXRbdHlwZT0iZW1haWwiXS5maXZlLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0uZml2ZSwgaW5wdXRbdHlwZT0ibnVtYmVyIl0uZml2ZSwgLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS5maXZlLCBpbnB1dFt0eXBlPSJzZWFyY2giXS5maXZlLCAucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLmZpdmUsIGlucHV0W3R5cGU9InRlbCJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0uZml2ZSwgaW5wdXRbdHlwZT0idGltZSJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLmZpdmUsIGlucHV0W3R5cGU9InVybCJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0idXJsIl0uZml2ZSwgdGV4dGFyZWEuZml2ZSwgLnJvdyB0ZXh0YXJlYS5maXZlIHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQorICBpbnB1dFt0eXBlPSJ0ZXh0Il0uc2l4LCAucm93IGlucHV0W3R5cGU9InRleHQiXS5zaXgsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0uc2l4LCAucm93IGlucHV0W3R5cGU9InBhc3N3b3JkIl0uc2l4LCBpbnB1dFt0eXBlPSJkYXRlIl0uc2l4LCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS5zaXgsIGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uc2l4LCAucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uc2l4LCBpbnB1dFt0eXBlPSJlbWFpbCJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJlbWFpbCJdLnNpeCwgaW5wdXRbdHlwZT0ibnVtYmVyIl0uc2l4LCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLnNpeCwgaW5wdXRbdHlwZT0ic2VhcmNoIl0uc2l4LCAucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLnNpeCwgaW5wdXRbdHlwZT0idGVsIl0uc2l4LCAucm93IGlucHV0W3R5cGU9InRlbCJdLnNpeCwgaW5wdXRbdHlwZT0idGltZSJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uc2l4LCBpbnB1dFt0eXBlPSJ1cmwiXS5zaXgsIC5yb3cgaW5wdXRbdHlwZT0idXJsIl0uc2l4LCB0ZXh0YXJlYS5zaXgsIC5yb3cgdGV4dGFyZWEuc2l4IHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQorICBpbnB1dFt0eXBlPSJ0ZXh0Il0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnNldmVuLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnNldmVuLCAucm93IGlucHV0W3R5cGU9InBhc3N3b3JkIl0uc2V2ZW4sIGlucHV0W3R5cGU9ImRhdGUiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0uc2V2ZW4sIGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5zZXZlbiwgaW5wdXRbdHlwZT0iZW1haWwiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJlbWFpbCJdLnNldmVuLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS5zZXZlbiwgaW5wdXRbdHlwZT0ic2VhcmNoIl0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0uc2V2ZW4sIGlucHV0W3R5cGU9InRlbCJdLnNldmVuLCAucm93IGlucHV0W3R5cGU9InRlbCJdLnNldmVuLCBpbnB1dFt0eXBlPSJ0aW1lIl0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLnNldmVuLCBpbnB1dFt0eXBlPSJ1cmwiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5zZXZlbiwgdGV4dGFyZWEuc2V2ZW4sIC5yb3cgdGV4dGFyZWEuc2V2ZW4geyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS5laWdodCwgLnJvdyBpbnB1dFt0eXBlPSJ0ZXh0Il0uZWlnaHQsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0uZWlnaHQsIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5laWdodCwgaW5wdXRbdHlwZT0iZGF0ZSJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS5laWdodCwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5laWdodCwgLnJvdyBpbnB1dFt0eXBlPSJkYXRldGltZSJdLmVpZ2h0LCBpbnB1dFt0eXBlPSJlbWFpbCJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0uZWlnaHQsIGlucHV0W3R5cGU9Im51bWJlciJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLmVpZ2h0LCBpbnB1dFt0eXBlPSJzZWFyY2giXS5laWdodCwgLnJvdyBpbnB1dFt0eXBlPSJzZWFyY2giXS5laWdodCwgaW5wdXRbdHlwZT0idGVsIl0uZWlnaHQsIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0uZWlnaHQsIGlucHV0W3R5cGU9InRpbWUiXS5laWdodCwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uZWlnaHQsIGlucHV0W3R5cGU9InVybCJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9InVybCJdLmVpZ2h0LCB0ZXh0YXJlYS5laWdodCwgLnJvdyB0ZXh0YXJlYS5laWdodCB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KKyAgaW5wdXRbdHlwZT0idGV4dCJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLm5pbmUsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0ubmluZSwgLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLm5pbmUsIGlucHV0W3R5cGU9ImRhdGUiXS5uaW5lLCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS5uaW5lLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5uaW5lLCBpbnB1dFt0eXBlPSJlbWFpbCJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5uaW5lLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5uaW5lLCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLm5pbmUsIGlucHV0W3R5cGU9InNlYXJjaCJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0ubmluZSwgaW5wdXRbdHlwZT0idGVsIl0ubmluZSwgLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5uaW5lLCBpbnB1dFt0eXBlPSJ0aW1lIl0ubmluZSwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0ubmluZSwgaW5wdXRbdHlwZT0idXJsIl0ubmluZSwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5uaW5lLCB0ZXh0YXJlYS5uaW5lLCAucm93IHRleHRhcmVhLm5pbmUgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnRlbiwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50ZW4sIGlucHV0W3R5cGU9ImRhdGUiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLnRlbiwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50ZW4sIGlucHV0W3R5cGU9ImVtYWlsIl0udGVuLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0udGVuLCBpbnB1dFt0eXBlPSJudW1iZXIiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0udGVuLCBpbnB1dFt0eXBlPSJzZWFyY2giXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0udGVuLCBpbnB1dFt0eXBlPSJ0ZWwiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0udGVuLCBpbnB1dFt0eXBlPSJ0aW1lIl0udGVuLCAucm93IGlucHV0W3R5cGU9InRpbWUiXS50ZW4sIGlucHV0W3R5cGU9InVybCJdLnRlbiwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS50ZW4sIHRleHRhcmVhLnRlbiwgLnJvdyB0ZXh0YXJlYS50ZW4geyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLmVsZXZlbiwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5lbGV2ZW4sIGlucHV0W3R5cGU9ImRhdGUiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLmVsZXZlbiwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5lbGV2ZW4sIGlucHV0W3R5cGU9ImVtYWlsIl0uZWxldmVuLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0uZWxldmVuLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0uZWxldmVuLCBpbnB1dFt0eXBlPSJzZWFyY2giXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0uZWxldmVuLCBpbnB1dFt0eXBlPSJ0ZWwiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0uZWxldmVuLCBpbnB1dFt0eXBlPSJ0aW1lIl0uZWxldmVuLCAucm93IGlucHV0W3R5cGU9InRpbWUiXS5lbGV2ZW4sIGlucHV0W3R5cGU9InVybCJdLmVsZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5lbGV2ZW4sIHRleHRhcmVhLmVsZXZlbiwgLnJvdyB0ZXh0YXJlYS5lbGV2ZW4geyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CisgIGlucHV0W3R5cGU9InRleHQiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnR3ZWx2ZSwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50d2VsdmUsIGlucHV0W3R5cGU9ImRhdGUiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLnR3ZWx2ZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50d2VsdmUsIGlucHV0W3R5cGU9ImVtYWlsIl0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJudW1iZXIiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJzZWFyY2giXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJ0ZWwiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJ0aW1lIl0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9InRpbWUiXS50d2VsdmUsIGlucHV0W3R5cGU9InVybCJdLnR3ZWx2ZSwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS50d2VsdmUsIHRleHRhcmVhLnR3ZWx2ZSwgLnJvdyB0ZXh0YXJlYS50d2VsdmUgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9IH0KKy8qIEN1c3RvbSBGb3JtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitmb3JtLmN1c3RvbSB7IC8qIEN1c3RvbSBpbnB1dCwgZGlzYWJsZWQgKi8gfQorZm9ybS5jdXN0b20gc3Bhbi5jdXN0b20geyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAycHg7IGJvcmRlcjogc29saWQgMXB4ICNjY2M7IGJhY2tncm91bmQ6ICNmZmY7IH0KK2Zvcm0uY3VzdG9tIHNwYW4uY3VzdG9tLnJhZGlvIHsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMDBweDsgLW1vei1ib3JkZXItcmFkaXVzOiAxMDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDEwMHB4OyAtby1ib3JkZXItcmFkaXVzOiAxMDBweDsgYm9yZGVyLXJhZGl1czogMTAwcHg7IH0KK2Zvcm0uY3VzdG9tIHNwYW4uY3VzdG9tLmNoZWNrYm94OmJlZm9yZSB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgbGluZS1oZWlnaHQ6IDAuODsgaGVpZ2h0OiAxNHB4OyB3aWR0aDogMTRweDsgdGV4dC1hbGlnbjogY2VudGVyOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogI2ZmZjsgfQorZm9ybS5jdXN0b20gc3Bhbi5jdXN0b20ucmFkaW8uY2hlY2tlZDpiZWZvcmUgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiA4cHg7IGhlaWdodDogOHB4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwMHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDEwMHB4OyAtbXMtYm9yZGVyLXJhZGl1czogMTAwcHg7IC1vLWJvcmRlci1yYWRpdXM6IDEwMHB4OyBib3JkZXItcmFkaXVzOiAxMDBweDsgYmFja2dyb3VuZDogIzIyMjsgcG9zaXRpb246IHJlbGF0aXZlOyB0b3A6IDNweDsgbGVmdDogM3B4OyB9Citmb3JtLmN1c3RvbSBzcGFuLmN1c3RvbS5jaGVja2JveC5jaGVja2VkOmJlZm9yZSB7IGNvbnRlbnQ6ICJcMDBkNyI7IGNvbG9yOiAjMjIyOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHsgZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiByZWxhdGl2ZTsgd2lkdGg6IGF1dG87IGhlaWdodDogMjhweDsgbWFyZ2luLWJvdHRvbTogOXB4OyBtYXJnaW4tdG9wOiAycHg7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gYS5jdXJyZW50IHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiBhdXRvOyBsaW5lLWhlaWdodDogMjZweDsgbWluLWhlaWdodDogMjhweDsgcGFkZGluZzogMDsgcGFkZGluZy1sZWZ0OiA2cHg7IHBhZGRpbmctcmlnaHQ6IDM4cHg7IGJvcmRlcjogc29saWQgMXB4ICNkZGQ7IGNvbG9yOiAjMTQxNDE0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIGEuc2VsZWN0b3IgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAyN3B4OyBoZWlnaHQ6IDI4cHg7IGRpc3BsYXk6IGJsb2NrOyByaWdodDogMDsgdG9wOiAwOyBib3JkZXI6IHNvbGlkIDFweCAjZGRkOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIGEuc2VsZWN0b3I6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA1cHg7IGJvcmRlci1jb2xvcjogI2FhYWFhYSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiA1MCU7IHRvcDogNTAlOyBtYXJnaW4tdG9wOiAtMnB4OyBtYXJnaW4tbGVmdDogLTVweDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bjpob3ZlciBhLnNlbGVjdG9yOmFmdGVyLCBmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4gYS5zZWxlY3RvcjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA1cHg7IGJvcmRlci1jb2xvcjogIzIyMjIyMiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuIHVsIHsgZGlzcGxheTogYmxvY2s7IHotaW5kZXg6IDEwOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLnNtYWxsIHsgd2lkdGg6IDEzNHB4ICFpbXBvcnRhbnQ7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24ubWVkaXVtIHsgd2lkdGg6IDI1NHB4ICFpbXBvcnRhbnQ7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24ubGFyZ2UgeyB3aWR0aDogNDM0cHggIWltcG9ydGFudDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5leHBhbmQgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4uc21hbGwgdWwgeyB3aWR0aDogMTM0cHggIWltcG9ydGFudDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuLm1lZGl1bSB1bCB7IHdpZHRoOiAyNTRweCAhaW1wb3J0YW50OyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4ubGFyZ2UgdWwgeyB3aWR0aDogNDM0cHggIWltcG9ydGFudDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuLmV4cGFuZCB1bCB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiBhdXRvOyBkaXNwbGF5OiBub25lOyBtYXJnaW46IDA7IGxlZnQ6IDA7IHRvcDogMjdweDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBiYWNrZ3JvdW5kOiAjZmZmOyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOyBib3JkZXI6IHNvbGlkIDFweCAjY2NjY2NjOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpIHsgY29sb3I6ICM1NTU7IGZvbnQtc2l6ZTogMTNweDsgY3Vyc29yOiBwb2ludGVyOyBwYWRkaW5nOiAzcHg7IHBhZGRpbmctbGVmdDogNnB4OyBwYWRkaW5nLXJpZ2h0OiAzOHB4OyBtaW4taGVpZ2h0OiAxOHB4OyBsaW5lLWhlaWdodDogMThweDsgbWFyZ2luOiAwOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBsaXN0LXN0eWxlOiBub25lOyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpLnNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2NkZWJmNTsgY29sb3I6ICMwMDA7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgbGkuc2VsZWN0ZWQ6YWZ0ZXIgeyBjb250ZW50OiAiXDIwMTMiOyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxMHB4OyB9Citmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2UzZjRmOTsgY29sb3I6ICMyMjI7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgbGk6aG92ZXI6YWZ0ZXIgeyBjb250ZW50OiAiXDIwMTMiOyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxMHB4OyBjb2xvcjogIzhlZDNlNzsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bCBsaS5zZWxlY3RlZDpob3ZlciB7IGJhY2tncm91bmQ6ICNjZGViZjU7IGN1cnNvcjogZGVmYXVsdDsgY29sb3I6ICMwMDA7IH0KK2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgbGkuc2VsZWN0ZWQ6aG92ZXI6YWZ0ZXIgeyBjb2xvcjogIzAwMDsgfQorZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bC5zaG93IHsgZGlzcGxheTogYmxvY2s7IH0KK2Zvcm0uY3VzdG9tIC5jdXN0b20uZGlzYWJsZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOyB9CisKKy8qIENvcnJlY3QgRkYgY3VzdG9tIGRyb3Bkb3duIGhlaWdodCAqLworQC1tb3otZG9jdW1lbnQgdXJsLXByZWZpeCgpIHsgZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biBhLnNlbGVjdG9yIHsgaGVpZ2h0OiAzMHB4OyB9IH0KKworLmx0LWllOSBmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIGEuc2VsZWN0b3IgeyBoZWlnaHQ6IDMwcHg7IH0KKworLyogVGhlIEdyaWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLnJvdyB7IHdpZHRoOiAxMDAwcHg7IG1heC13aWR0aDogMTAwJTsgbWluLXdpZHRoOiA3NjhweDsgbWFyZ2luOiAwIGF1dG87IH0KKy5yb3cgLnJvdyB7IHdpZHRoOiBhdXRvOyBtYXgtd2lkdGg6IG5vbmU7IG1pbi13aWR0aDogMDsgbWFyZ2luOiAwIC0xNXB4OyB9Cisucm93LmNvbGxhcHNlIC5jb2x1bW4sIC5yb3cuY29sbGFwc2UgLmNvbHVtbnMgeyBwYWRkaW5nOiAwOyB9Cisucm93IC5yb3cgeyB3aWR0aDogYXV0bzsgbWF4LXdpZHRoOiBub25lOyBtaW4td2lkdGg6IDA7IG1hcmdpbjogMCAtMTVweDsgfQorLnJvdyAucm93LmNvbGxhcHNlIHsgbWFyZ2luOiAwOyB9CisKKy5jb2x1bW4sIC5jb2x1bW5zIHsgZmxvYXQ6IGxlZnQ7IG1pbi1oZWlnaHQ6IDFweDsgcGFkZGluZzogMCAxNXB4OyBwb3NpdGlvbjogcmVsYXRpdmU7IH0KKy5jb2x1bW4uY2VudGVyZWQsIC5jb2x1bW5zLmNlbnRlcmVkIHsgZmxvYXQ6IG5vbmU7IG1hcmdpbjogMCBhdXRvOyB9CisKK1tjbGFzcyo9ImNvbHVtbiJdICsgW2NsYXNzKj0iY29sdW1uIl06bGFzdC1jaGlsZCB7IGZsb2F0OiByaWdodDsgfQorCitbY2xhc3MqPSJjb2x1bW4iXSArIFtjbGFzcyo9ImNvbHVtbiJdLmVuZCB7IGZsb2F0OiBsZWZ0OyB9CisKKy5vbmUsIC5yb3cgLm9uZSB7IHdpZHRoOiA4LjMzMzMzJTsgfQorCisudHdvLCAucm93IC50d28geyB3aWR0aDogMTYuNjY2NjclOyB9CisKKy50aHJlZSwgLnJvdyAudGhyZWUgeyB3aWR0aDogMjUlOyB9CisKKy5mb3VyLCAucm93IC5mb3VyIHsgd2lkdGg6IDMzLjMzMzMzJTsgfQorCisuZml2ZSwgLnJvdyAuZml2ZSB7IHdpZHRoOiA0MS42NjY2NyU7IH0KKworLnNpeCwgLnJvdyAuc2l4IHsgd2lkdGg6IDUwJTsgfQorCisuc2V2ZW4sIC5yb3cgLnNldmVuIHsgd2lkdGg6IDU4LjMzMzMzJTsgfQorCisuZWlnaHQsIC5yb3cgLmVpZ2h0IHsgd2lkdGg6IDY2LjY2NjY3JTsgfQorCisubmluZSwgLnJvdyAubmluZSB7IHdpZHRoOiA3NSU7IH0KKworLnRlbiwgLnJvdyAudGVuIHsgd2lkdGg6IDgzLjMzMzMzJTsgfQorCisuZWxldmVuLCAucm93IC5lbGV2ZW4geyB3aWR0aDogOTEuNjY2NjclOyB9CisKKy50d2VsdmUsIC5yb3cgLnR3ZWx2ZSB7IHdpZHRoOiAxMDAlOyB9CisKKy5yb3cgLm9mZnNldC1ieS1vbmUgeyBtYXJnaW4tbGVmdDogOC4zMzMzMyU7IH0KKworLnJvdyAub2Zmc2V0LWJ5LXR3byB7IG1hcmdpbi1sZWZ0OiAxNi42NjY2NyU7IH0KKworLnJvdyAub2Zmc2V0LWJ5LXRocmVlIHsgbWFyZ2luLWxlZnQ6IDI1JTsgfQorCisucm93IC5vZmZzZXQtYnktZm91ciB7IG1hcmdpbi1sZWZ0OiAzMy4zMzMzMyU7IH0KKworLnJvdyAub2Zmc2V0LWJ5LWZpdmUgeyBtYXJnaW4tbGVmdDogNDEuNjY2NjclOyB9CisKKy5yb3cgLm9mZnNldC1ieS1zaXggeyBtYXJnaW4tbGVmdDogNTAlOyB9CisKKy5yb3cgLm9mZnNldC1ieS1zZXZlbiB7IG1hcmdpbi1sZWZ0OiA1OC4zMzMzMyU7IH0KKworLnJvdyAub2Zmc2V0LWJ5LWVpZ2h0IHsgbWFyZ2luLWxlZnQ6IDY2LjY2NjY3JTsgfQorCisucm93IC5vZmZzZXQtYnktbmluZSB7IG1hcmdpbi1sZWZ0OiA3NSU7IH0KKworLnJvdyAub2Zmc2V0LWJ5LXRlbiB7IG1hcmdpbi1sZWZ0OiA4My4zMzMzMyU7IH0KKworLnB1c2gtdHdvIHsgbGVmdDogMTYuNjY2NjclOyB9CisKKy5wdWxsLXR3byB7IHJpZ2h0OiAxNi42NjY2NyU7IH0KKworLnB1c2gtdGhyZWUgeyBsZWZ0OiAyNSU7IH0KKworLnB1bGwtdGhyZWUgeyByaWdodDogMjUlOyB9CisKKy5wdXNoLWZvdXIgeyBsZWZ0OiAzMy4zMzMzMyU7IH0KKworLnB1bGwtZm91ciB7IHJpZ2h0OiAzMy4zMzMzMyU7IH0KKworLnB1c2gtZml2ZSB7IGxlZnQ6IDQxLjY2NjY3JTsgfQorCisucHVsbC1maXZlIHsgcmlnaHQ6IDQxLjY2NjY3JTsgfQorCisucHVzaC1zaXggeyBsZWZ0OiA1MCU7IH0KKworLnB1bGwtc2l4IHsgcmlnaHQ6IDUwJTsgfQorCisucHVzaC1zZXZlbiB7IGxlZnQ6IDU4LjMzMzMzJTsgfQorCisucHVsbC1zZXZlbiB7IHJpZ2h0OiA1OC4zMzMzMyU7IH0KKworLnB1c2gtZWlnaHQgeyBsZWZ0OiA2Ni42NjY2NyU7IH0KKworLnB1bGwtZWlnaHQgeyByaWdodDogNjYuNjY2NjclOyB9CisKKy5wdXNoLW5pbmUgeyBsZWZ0OiA3NSU7IH0KKworLnB1bGwtbmluZSB7IHJpZ2h0OiA3NSU7IH0KKworLnB1c2gtdGVuIHsgbGVmdDogODMuMzMzMzMlOyB9CisKKy5wdWxsLXRlbiB7IHJpZ2h0OiA4My4zMzMzMyU7IH0KKworaW1nLCBvYmplY3QsIGVtYmVkIHsgbWF4LXdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG87IH0KKworb2JqZWN0LCBlbWJlZCB7IGhlaWdodDogMTAwJTsgfQorCitpbWcgeyAtbXMtaW50ZXJwb2xhdGlvbi1tb2RlOiBiaWN1YmljOyB9CisKKyNtYXBfY2FudmFzIGltZywgLm1hcF9jYW52YXMgaW1nIHsgbWF4LXdpZHRoOiBub25lIWltcG9ydGFudDsgfQorCisvKiBOaWNvbGFzIEdhbGxhZ2hlcidzIG1pY3JvIGNsZWFyZml4ICovCisucm93IHsgKnpvb206IDE7IH0KKy5yb3c6YmVmb3JlLCAucm93OmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IHRhYmxlOyB9Cisucm93OmFmdGVyIHsgY2xlYXI6IGJvdGg7IH0KKworLyogTW9iaWxlIEdyaWQgYW5kIE92ZXJyaWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IGJvZHkgeyAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IG5vbmU7IC1tcy10ZXh0LXNpemUtYWRqdXN0OiBub25lOyB3aWR0aDogMTAwJTsgbWluLXdpZHRoOiAwOyBtYXJnaW4tbGVmdDogMDsgbWFyZ2luLXJpZ2h0OiAwOyBwYWRkaW5nLWxlZnQ6IDA7IHBhZGRpbmctcmlnaHQ6IDA7IH0KKyAgLnJvdyB7IHdpZHRoOiBhdXRvOyBtaW4td2lkdGg6IDA7IG1hcmdpbi1sZWZ0OiAwOyBtYXJnaW4tcmlnaHQ6IDA7IH0KKyAgLmNvbHVtbiwgLmNvbHVtbnMgeyB3aWR0aDogYXV0byAhaW1wb3J0YW50OyBmbG9hdDogbm9uZTsgfQorICAuY29sdW1uOmxhc3QtY2hpbGQsIC5jb2x1bW5zOmxhc3QtY2hpbGQgeyBmbG9hdDogbm9uZTsgfQorICBbY2xhc3MqPSJjb2x1bW4iXSArIFtjbGFzcyo9ImNvbHVtbiJdOmxhc3QtY2hpbGQgeyBmbG9hdDogbm9uZTsgfQorICAuY29sdW1uOmJlZm9yZSwgLmNvbHVtbnM6YmVmb3JlLCAuY29sdW1uOmFmdGVyLCAuY29sdW1uczphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiB0YWJsZTsgfQorICAuY29sdW1uOmFmdGVyLCAuY29sdW1uczphZnRlciB7IGNsZWFyOiBib3RoOyB9CisgIC5vZmZzZXQtYnktb25lLCAub2Zmc2V0LWJ5LXR3bywgLm9mZnNldC1ieS10aHJlZSwgLm9mZnNldC1ieS1mb3VyLCAub2Zmc2V0LWJ5LWZpdmUsIC5vZmZzZXQtYnktc2l4LCAub2Zmc2V0LWJ5LXNldmVuLCAub2Zmc2V0LWJ5LWVpZ2h0LCAub2Zmc2V0LWJ5LW5pbmUsIC5vZmZzZXQtYnktdGVuIHsgbWFyZ2luLWxlZnQ6IDAgIWltcG9ydGFudDsgfQorICAucHVzaC10d28sIC5wdXNoLXRocmVlLCAucHVzaC1mb3VyLCAucHVzaC1maXZlLCAucHVzaC1zaXgsIC5wdXNoLXNldmVuLCAucHVzaC1laWdodCwgLnB1c2gtbmluZSwgLnB1c2gtdGVuIHsgbGVmdDogYXV0bzsgfQorICAucHVsbC10d28sIC5wdWxsLXRocmVlLCAucHVsbC1mb3VyLCAucHVsbC1maXZlLCAucHVsbC1zaXgsIC5wdWxsLXNldmVuLCAucHVsbC1laWdodCwgLnB1bGwtbmluZSwgLnB1bGwtdGVuIHsgcmlnaHQ6IGF1dG87IH0KKyAgLyogTW9iaWxlIDQtY29sdW1uIEdyaWQgKi8KKyAgLnJvdyAubW9iaWxlLW9uZSB7IHdpZHRoOiAyNSUgIWltcG9ydGFudDsgZmxvYXQ6IGxlZnQ7IHBhZGRpbmc6IDAgMTVweDsgfQorICAucm93IC5tb2JpbGUtb25lOmxhc3QtY2hpbGQgeyBmbG9hdDogcmlnaHQ7IH0KKyAgLnJvdy5jb2xsYXBzZSAubW9iaWxlLW9uZSB7IHBhZGRpbmc6IDA7IH0KKyAgLnJvdyAubW9iaWxlLXR3byB7IHdpZHRoOiA1MCUgIWltcG9ydGFudDsgZmxvYXQ6IGxlZnQ7IHBhZGRpbmc6IDAgMTVweDsgfQorICAucm93IC5tb2JpbGUtdHdvOmxhc3QtY2hpbGQgeyBmbG9hdDogcmlnaHQ7IH0KKyAgLnJvdy5jb2xsYXBzZSAubW9iaWxlLXR3byB7IHBhZGRpbmc6IDA7IH0KKyAgLnJvdyAubW9iaWxlLXRocmVlIHsgd2lkdGg6IDc1JSAhaW1wb3J0YW50OyBmbG9hdDogbGVmdDsgcGFkZGluZzogMCAxNXB4OyB9CisgIC5yb3cgLm1vYmlsZS10aHJlZTpsYXN0LWNoaWxkIHsgZmxvYXQ6IHJpZ2h0OyB9CisgIC5yb3cuY29sbGFwc2UgLm1vYmlsZS10aHJlZSB7IHBhZGRpbmc6IDA7IH0KKyAgLnJvdyAubW9iaWxlLWZvdXIgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBmbG9hdDogbGVmdDsgcGFkZGluZzogMCAxNXB4OyB9CisgIC5yb3cgLm1vYmlsZS1mb3VyOmxhc3QtY2hpbGQgeyBmbG9hdDogcmlnaHQ7IH0KKyAgLnJvdy5jb2xsYXBzZSAubW9iaWxlLWZvdXIgeyBwYWRkaW5nOiAwOyB9CisgIC5wdXNoLW9uZS1tb2JpbGUgeyBsZWZ0OiAyNSU7IH0KKyAgLnB1bGwtb25lLW1vYmlsZSB7IHJpZ2h0OiAyNSU7IH0KKyAgLnB1c2gtdHdvLW1vYmlsZSB7IGxlZnQ6IDUwJTsgfQorICAucHVsbC10d28tbW9iaWxlIHsgcmlnaHQ6IDUwJTsgfQorICAucHVzaC10aHJlZS1tb2JpbGUgeyBsZWZ0OiA3NSU7IH0KKyAgLnB1bGwtdGhyZWUtbW9iaWxlIHsgcmlnaHQ6IDc1JTsgfSB9CisvKiBCbG9jayBHcmlkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaGVzZSBhcmUgMi11cCwgMy11cCwgNC11cCBhbmQgNS11cCBVTHMsIHN1aXRlZAorZm9yIHJlcGVhdGluZyBibG9ja3Mgb2YgY29udGVudC4gQWRkICdtb2JpbGUnIHRvCit0aGVtIHRvIHN3aXRjaCB0aGVtIGp1c3QgbGlrZSB0aGUgbGF5b3V0IGdyaWQKKyhvbmUgaXRlbSBwZXIgbGluZSkgb24gcGhvbmVzCisKK0ZvciBJRTcvOCBjb21wYXRpYmlsaXR5IGJsb2NrLWdyaWQgaXRlbXMgbmVlZCB0byBiZQordGhlIHNhbWUgaGVpZ2h0LiBZb3UgY2FuIG9wdGlvbmFsbHkgdW5jb21tZW50IHRoZQorbGluZXMgYmVsb3cgdG8gc3VwcG9ydCBhcmJpdHJhcnkgaGVpZ2h0LCBidXQga25vdwordGhhdCBJRTcvOCBkbyBub3Qgc3VwcG9ydCA6bnRoLWNoaWxkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy5ibG9jay1ncmlkIHsgZGlzcGxheTogYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IHBhZGRpbmc6IDA7IH0KKy5ibG9jay1ncmlkID4gbGkgeyBkaXNwbGF5OiBibG9jazsgaGVpZ2h0OiBhdXRvOyBmbG9hdDogbGVmdDsgfQorLmJsb2NrLWdyaWQub25lLXVwIHsgbWFyZ2luOiAwOyB9CisuYmxvY2stZ3JpZC5vbmUtdXAgPiBsaSB7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAwIDAgMTVweDsgfQorLmJsb2NrLWdyaWQudHdvLXVwIHsgbWFyZ2luOiAwIC0xNXB4OyB9CisuYmxvY2stZ3JpZC50d28tdXAgPiBsaSB7IHdpZHRoOiA1MCU7IHBhZGRpbmc6IDAgMTVweCAxNXB4OyB9CisuYmxvY2stZ3JpZC50d28tdXAgPiBsaTpudGgtY2hpbGQoMm4rMSkgeyBjbGVhcjogYm90aDsgfQorLmJsb2NrLWdyaWQudGhyZWUtdXAgeyBtYXJnaW46IDAgLTEycHg7IH0KKy5ibG9jay1ncmlkLnRocmVlLXVwID4gbGkgeyB3aWR0aDogMzMuMzMlOyBwYWRkaW5nOiAwIDEycHggMTJweDsgfQorLmJsb2NrLWdyaWQudGhyZWUtdXAgPiBsaTpudGgtY2hpbGQoM24rMSkgeyBjbGVhcjogYm90aDsgfQorLmJsb2NrLWdyaWQuZm91ci11cCB7IG1hcmdpbjogMCAtMTBweDsgfQorLmJsb2NrLWdyaWQuZm91ci11cCA+IGxpIHsgd2lkdGg6IDI1JTsgcGFkZGluZzogMCAxMHB4IDEwcHg7IH0KKy5ibG9jay1ncmlkLmZvdXItdXAgPiBsaTpudGgtY2hpbGQoNG4rMSkgeyBjbGVhcjogYm90aDsgfQorLmJsb2NrLWdyaWQuZml2ZS11cCB7IG1hcmdpbjogMCAtOHB4OyB9CisuYmxvY2stZ3JpZC5maXZlLXVwID4gbGkgeyB3aWR0aDogMjAlOyBwYWRkaW5nOiAwIDhweCA4cHg7IH0KKy5ibG9jay1ncmlkLmZpdmUtdXAgPiBsaTpudGgtY2hpbGQoNW4rMSkgeyBjbGVhcjogYm90aDsgfQorCisvKiBNb2JpbGUgQmxvY2sgR3JpZHMgKi8KK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsgLmJsb2NrLWdyaWQubW9iaWxlID4gbGkgeyBmbG9hdDogbm9uZTsgd2lkdGg6IDEwMCU7IG1hcmdpbi1sZWZ0OiAwOyB9CisgIC5ibG9jay1ncmlkID4gbGkgeyBjbGVhcjogbm9uZSAhaW1wb3J0YW50OyB9CisgIC5ibG9jay1ncmlkLm1vYmlsZS10d28tdXAgPiBsaSB7IHdpZHRoOiA1MCU7IH0KKyAgLmJsb2NrLWdyaWQubW9iaWxlLXR3by11cCA+IGxpOm50aC1jaGlsZCgybisxKSB7IGNsZWFyOiBib3RoOyB9CisgIC5ibG9jay1ncmlkLm1vYmlsZS10aHJlZS11cCA+IGxpIHsgd2lkdGg6IDMzLjMzJTsgfQorICAuYmxvY2stZ3JpZC5tb2JpbGUtdGhyZWUtdXAgPiBsaTpudGgtY2hpbGQoM24rMSkgeyBjbGVhcjogYm90aCAhaW1wb3J0YW50OyB9CisgIC5ibG9jay1ncmlkLm1vYmlsZS1mb3VyLXVwID4gbGkgeyB3aWR0aDogMjUlOyB9CisgIC5ibG9jay1ncmlkLm1vYmlsZS1mb3VyLXVwID4gbGk6bnRoLWNoaWxkKDRuKzEpIHsgY2xlYXI6IGJvdGg7IH0KKyAgLmJsb2NrLWdyaWQubW9iaWxlLWZpdmUtdXAgPiBsaTpudGgtY2hpbGQoNW4rMSkgeyBjbGVhcjogYm90aDsgfSB9CisvKiBSZXF1aXJlcyBnbG9iYWxzLmNzcyAqLworLyogTm9ybWFsIEJ1dHRvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLmJ1dHRvbiB7IHdpZHRoOiBhdXRvOyBiYWNrZ3JvdW5kOiAjZmQ3ODAwOyBib3JkZXI6IDFweCBzb2xpZCAjY2U2MjAwOyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgY29sb3I6IHdoaXRlOyBjdXJzb3I6IHBvaW50ZXI7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsICJIZWx2ZXRpY2EiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBsaW5lLWhlaWdodDogMTsgbWFyZ2luOiAwOyBvdXRsaW5lOiBub25lOyBwYWRkaW5nOiAxMHB4IDIwcHggMTFweDsgcG9zaXRpb246IHJlbGF0aXZlOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyAtbW96LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IC1vLXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IC8qIEhvdmVycyAqLyAvKiBTaXplcyAqLyAvKiBDb2xvcnMgKi8gLyogUmFkaWkgKi8gLyogTGF5b3V0ICovIC8qIERpc2FibGVkIC0tLS0tLS0tLS0gKi8gfQorLmJ1dHRvbjpob3ZlciB7IGNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogI2NlNjIwMDsgfQorLmJ1dHRvbjphY3RpdmUgeyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpIGluc2V0OyBib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMCwgMCwgMCwgMC4yKSBpbnNldDsgfQorLmJ1dHRvbjpmb2N1cyB7IC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDRweCAjZmQ3ODAwLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgLW1vei1ib3gtc2hhZG93OiAwIDAgNHB4ICNmZDc4MDAsIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBib3gtc2hhZG93OiAwIDAgNHB4ICNmZDc4MDAsIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBjb2xvcjogd2hpdGU7IH0KKy5idXR0b24ubGFyZ2UgeyBmb250LXNpemU6IDE3cHg7IHBhZGRpbmc6IDE1cHggMzBweCAxNnB4OyB9CisuYnV0dG9uLm1lZGl1bSB7IGZvbnQtc2l6ZTogMTRweDsgfQorLmJ1dHRvbi5zbWFsbCB7IGZvbnQtc2l6ZTogMTFweDsgcGFkZGluZzogN3B4IDE0cHggOHB4OyB9CisuYnV0dG9uLnRpbnkgeyBmb250LXNpemU6IDEwcHg7IHBhZGRpbmc6IDVweCAxMHB4IDZweDsgfQorLmJ1dHRvbi5leHBhbmQgeyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyB9CisuYnV0dG9uLnByaW1hcnkgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQ3ODAwOyBib3JkZXI6IDFweCBzb2xpZCAjMWU3MjhjOyB9CisuYnV0dG9uLnByaW1hcnk6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMjI4NGExOyB9CisuYnV0dG9uLnByaW1hcnk6Zm9jdXMgeyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA0cHggI2ZkNzgwMCwgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IC1tb3otYm94LXNoYWRvdzogMCAwIDRweCAjZmQ3ODAwLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgYm94LXNoYWRvdzogMCAwIDRweCAjZmQ3ODAwLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgfQorLmJ1dHRvbi5zdWNjZXNzIHsgYmFja2dyb3VuZC1jb2xvcjogIzVkYTQyMzsgYm9yZGVyOiAxcHggc29saWQgIzM5NjUxNjsgfQorLmJ1dHRvbi5zdWNjZXNzOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogIzQ1N2ExYTsgfQorLmJ1dHRvbi5zdWNjZXNzOmZvY3VzIHsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNXB4ICM1ZGE0MjMsIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDAgMCA1cHggIzVkYTQyMywgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IGJveC1zaGFkb3c6IDAgMCA1cHggIzVkYTQyMywgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IH0KKy5idXR0b24uYWxlcnQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYzYwZjEzOyBib3JkZXI6IDFweCBzb2xpZCAjN2YwYTBjOyB9CisuYnV0dG9uLmFsZXJ0OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogIzk3MGIwZTsgfQorLmJ1dHRvbi5hbGVydDpmb2N1cyB7IC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDRweCAjYzYwZjEzLCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgLW1vei1ib3gtc2hhZG93OiAwIDAgNHB4ICNjNjBmMTMsIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBib3gtc2hhZG93OiAwIDAgNHB4ICNjNjBmMTMsIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyB9CisuYnV0dG9uLnNlY29uZGFyeSB7IGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7IGNvbG9yOiAjMWQxZDFkOyBib3JkZXI6IDFweCBzb2xpZCAjYzNjM2MzOyB9CisuYnV0dG9uLnNlY29uZGFyeTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7IH0KKy5idXR0b24uc2Vjb25kYXJ5OmZvY3VzIHsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNXB4ICNlOWU5ZTksIDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDAgMCA1cHggI2U5ZTllOSwgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IGJveC1zaGFkb3c6IDAgMCA1cHggI2U5ZTllOSwgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IH0KKy5idXR0b24ucmFkaXVzIHsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7IC1tb3otYm9yZGVyLXJhZGl1czogM3B4OyAtbXMtYm9yZGVyLXJhZGl1czogM3B4OyAtby1ib3JkZXItcmFkaXVzOiAzcHg7IGJvcmRlci1yYWRpdXM6IDNweDsgfQorLmJ1dHRvbi5yb3VuZCB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTAwMHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW8tYm9yZGVyLXJhZGl1czogMTAwMHB4OyBib3JkZXItcmFkaXVzOiAxMDAwcHg7IH0KKy5idXR0b24uZnVsbC13aWR0aCB7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmctbGVmdDogMHB4ICFpbXBvcnRhbnQ7IHBhZGRpbmctcmlnaHQ6IDBweCAhaW1wb3J0YW50OyB9CisuYnV0dG9uLmxlZnQtYWxpZ24geyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMTJweDsgfQorLmJ1dHRvbi5kaXNhYmxlZCwgLmJ1dHRvbltkaXNhYmxlZF0geyBvcGFjaXR5OiAwLjY7IGN1cnNvcjogZGVmYXVsdDsgYmFja2dyb3VuZDogI2ZkNzgwMDsgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOyAtbW96LWJveC1zaGFkb3c6IG5vbmU7IGJveC1zaGFkb3c6IG5vbmU7IH0KKy5idXR0b24uZGlzYWJsZWQgOmhvdmVyLCAuYnV0dG9uW2Rpc2FibGVkXSA6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjZmQ3ODAwOyB9CisuYnV0dG9uLmRpc2FibGVkLnN1Y2Nlc3MsIC5idXR0b25bZGlzYWJsZWRdLnN1Y2Nlc3MgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNWRhNDIzOyB9CisuYnV0dG9uLmRpc2FibGVkLnN1Y2Nlc3M6aG92ZXIsIC5idXR0b25bZGlzYWJsZWRdLnN1Y2Nlc3M6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNWRhNDIzOyB9CisuYnV0dG9uLmRpc2FibGVkLmFsZXJ0LCAuYnV0dG9uW2Rpc2FibGVkXS5hbGVydCB7IGJhY2tncm91bmQtY29sb3I6ICNjNjBmMTM7IH0KKy5idXR0b24uZGlzYWJsZWQuYWxlcnQ6aG92ZXIsIC5idXR0b25bZGlzYWJsZWRdLmFsZXJ0OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2M2MGYxMzsgfQorLmJ1dHRvbi5kaXNhYmxlZC5zZWNvbmRhcnksIC5idXR0b25bZGlzYWJsZWRdLnNlY29uZGFyeSB7IGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7IH0KKy5idXR0b24uZGlzYWJsZWQuc2Vjb25kYXJ5OmhvdmVyLCAuYnV0dG9uW2Rpc2FibGVkXS5zZWNvbmRhcnk6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OyB9CisKKy8qIERvbid0IHVzZSBuYXRpdmUgYnV0dG9ucyBvbiBpT1MgKi8KK2lucHV0W3R5cGU9c3VibWl0XS5idXR0b24sIGJ1dHRvbi5idXR0b24geyAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IH0KKworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyAuYnV0dG9uIHsgZGlzcGxheTogYmxvY2s7IH0KKyAgYnV0dG9uLmJ1dHRvbiwgaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uIHsgd2lkdGg6IDEwMCU7IHBhZGRpbmctbGVmdDogMDsgcGFkZGluZy1yaWdodDogMDsgfSB9CisvKiBDb3JyZWN0IEZGIGJ1dHRvbiBwYWRkaW5nICovCitALW1vei1kb2N1bWVudCB1cmwtcHJlZml4KCkgeyBidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsIGlucHV0W3R5cGU9InJlc2V0Il06Oi1tb3otZm9jdXMtaW5uZXIsIGlucHV0W3R5cGU9ImJ1dHRvbiJdOjotbW96LWZvY3VzLWlubmVyLCBpbnB1dFt0eXBlPSJzdWJtaXQiXTo6LW1vei1mb2N1cy1pbm5lciwgaW5wdXRbdHlwZT0iZmlsZSJdID4gaW5wdXRbdHlwZT0iYnV0dG9uIl06Oi1tb3otZm9jdXMtaW5uZXIgeyBib3JkZXI6IG5vbmU7IHBhZGRpbmc6IDA7IH0KKyAgaW5wdXRbdHlwZT0ic3VibWl0Il0udGlueS5idXR0b24geyBwYWRkaW5nOiAzcHggMTBweCA0cHg7IH0KKyAgaW5wdXRbdHlwZT0ic3VibWl0Il0uc21hbGwuYnV0dG9uIHsgcGFkZGluZzogNXB4IDE0cHggNnB4OyB9CisgIGlucHV0W3R5cGU9InN1Ym1pdCJdLmJ1dHRvbiwgaW5wdXRbdHlwZT1zdWJtaXRdLm1lZGl1bS5idXR0b24geyBwYWRkaW5nOiA4cHggMjBweCA5cHg7IH0KKyAgaW5wdXRbdHlwZT0ic3VibWl0Il0ubGFyZ2UuYnV0dG9uIHsgcGFkZGluZzogMTNweCAzMHB4IDE0cHg7IH0gfQorCisvKiBCdXR0b25zIHdpdGggRHJvcGRvd25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy5idXR0b24uZHJvcGRvd24geyBwb3NpdGlvbjogcmVsYXRpdmU7IHBhZGRpbmctcmlnaHQ6IDQ0cHg7IC8qIFNpemVzICovIC8qIFRyaWFuZ2xlcyAqLyAvKiBGbHlvdXQgTGlzdCAqLyAvKiBTcGxpdCBEcm9wZG93biBCdXR0b25zICovIH0KKy5idXR0b24uZHJvcGRvd24ubGFyZ2UgeyBwYWRkaW5nLXJpZ2h0OiA2MHB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNtYWxsIHsgcGFkZGluZy1yaWdodDogMjhweDsgfQorLmJ1dHRvbi5kcm9wZG93bi50aW55IHsgcGFkZGluZy1yaWdodDogMjBweDsgfQorLmJ1dHRvbi5kcm9wZG93bjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA2cHg7IGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MCU7IHJpZ2h0OiAyMHB4OyBtYXJnaW4tdG9wOiAtMnB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLmxhcmdlOmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDdweDsgYm9yZGVyLWNvbG9yOiB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgbWFyZ2luLXRvcDogLTNweDsgcmlnaHQ6IDMwcHg7IH0KKy5idXR0b24uZHJvcGRvd24uc21hbGw6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNXB4OyBib3JkZXItY29sb3I6IHdoaXRlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyBtYXJnaW4tdG9wOiAtMnB4OyByaWdodDogMTRweDsgfQorLmJ1dHRvbi5kcm9wZG93bi50aW55OmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDRweDsgYm9yZGVyLWNvbG9yOiB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgbWFyZ2luLXRvcDogLTFweDsgcmlnaHQ6IDEwcHg7IH0KKy5idXR0b24uZHJvcGRvd24gPiB1bCB7IC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7IC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7IGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyBkaXNwbGF5OiBub25lOyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IC0xcHg7IGJhY2tncm91bmQ6ICNmZmY7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7IGxpc3Qtc3R5bGU6IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsgYm9yZGVyLXRvcDogbm9uZTsgbWluLXdpZHRoOiAxMDAlOyB6LWluZGV4OiA0MDsgfQorLmJ1dHRvbi5kcm9wZG93biA+IHVsIGxpIHsgd2lkdGg6IDEwMCU7IGN1cnNvcjogcG9pbnRlcjsgcGFkZGluZzogMDsgbWluLWhlaWdodDogMThweDsgbGluZS1oZWlnaHQ6IDE4cHg7IG1hcmdpbjogMDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgbGlzdC1zdHlsZTogbm9uZTsgfQorLmJ1dHRvbi5kcm9wZG93biA+IHVsIGxpIGEgeyBkaXNwbGF5OiBibG9jazsgY29sb3I6ICM1NTU7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgcGFkZGluZzogNnB4IDE0cHg7IHRleHQtYWxpZ246IGxlZnQ7IH0KKy5idXR0b24uZHJvcGRvd24gPiB1bCBsaTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICNlM2Y0Zjk7IGNvbG9yOiAjMjIyOyB9CisuYnV0dG9uLmRyb3Bkb3duID4gdWwgbGkuZGl2aWRlciB7IG1pbi1oZWlnaHQ6IDA7IHBhZGRpbmc6IDA7IGhlaWdodDogMXB4OyBtYXJnaW46IDRweCAwOyBiYWNrZ3JvdW5kOiAjZWRlZGVkOyB9CisuYnV0dG9uLmRyb3Bkb3duLnVwID4gdWwgeyBib3JkZXItdG9wOiAxcHggc29saWQgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTogbm9uZTsgfQorLmJ1dHRvbi5kcm9wZG93biB1bC5uby1ob3Zlci5zaG93LWRyb3Bkb3duIHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQorLmJ1dHRvbi5kcm9wZG93bjpob3ZlciA+IHVsLm5vLWhvdmVyIHsgZGlzcGxheTogbm9uZTsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdCB7IHBhZGRpbmc6IDA7IHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogU2l6ZXMgKi8gLyogVHJpYW5nbGUgU3BhbnMgKi8gLyogQ29sb3JzICovIH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQ6YWZ0ZXIgeyBkaXNwbGF5OiBub25lOyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZkNzgwMDsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5hbGVydDpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICNjNjBmMTM7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQuc3VjY2Vzczpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICM1ZGE0MjM7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5OmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdCA+IGEgeyBjb2xvcjogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBwYWRkaW5nOiAxMHB4IDUwcHggMTFweCAyMHB4OyBwYWRkaW5nLWxlZnQ6IDIwcHg7IHBhZGRpbmctcmlnaHQ6IDUwcHg7IC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dDsgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyAtby10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0ID4gYTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICMyMjg0YTE7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQubGFyZ2UgPiBhIHsgcGFkZGluZzogMTVweCA3NXB4IDE2cHggMzBweDsgcGFkZGluZy1sZWZ0OiAzMHB4OyBwYWRkaW5nLXJpZ2h0OiA3NXB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNtYWxsID4gYSB7IHBhZGRpbmc6IDdweCAzNXB4IDhweCAxNHB4OyBwYWRkaW5nLWxlZnQ6IDE0cHg7IHBhZGRpbmctcmlnaHQ6IDM1cHg7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQudGlueSA+IGEgeyBwYWRkaW5nOiA1cHggMjVweCA2cHggMTBweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyBwYWRkaW5nLXJpZ2h0OiAyNXB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0ID4gc3BhbiB7IGJhY2tncm91bmQtY29sb3I6ICNmZDc4MDA7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDA7IHRvcDogMDsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMzBweDsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjMWU3MjhjOyAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IC1tb3otYm94LXNoYWRvdzogMXB4IDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgYm94LXNoYWRvdzogMXB4IDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyAtbW96LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IC1vLXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQgPiBzcGFuOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogIzIyODRhMTsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdCA+IHNwYW46YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNnB4OyBib3JkZXItY29sb3I6IHdoaXRlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyBsZWZ0OiA1MCU7IG1hcmdpbi1sZWZ0OiAtNnB4OyBtYXJnaW4tdG9wOiAtMnB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNlY29uZGFyeSA+IHNwYW46YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNnB4OyBib3JkZXItY29sb3I6ICMxZDFkMWQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQubGFyZ2Ugc3BhbiB7IHdpZHRoOiA0NXB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNtYWxsIHNwYW4geyB3aWR0aDogMjFweDsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC50aW55IHNwYW4geyB3aWR0aDogMTVweDsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5sYXJnZSBzcGFuOmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDdweDsgYm9yZGVyLWNvbG9yOiB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgbWFyZ2luLXRvcDogLTNweDsgbWFyZ2luLWxlZnQ6IC03cHg7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQuc21hbGwgc3BhbjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA0cHg7IGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IC0xcHg7IG1hcmdpbi1sZWZ0OiAtNHB4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnRpbnkgc3BhbjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCAzcHg7IGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IC0xcHg7IG1hcmdpbi1sZWZ0OiAtM3B4OyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LmFsZXJ0ID4gc3BhbiB7IGJhY2tncm91bmQtY29sb3I6ICNjNjBmMTM7IGJvcmRlci1sZWZ0LWNvbG9yOiAjN2YwYTBjOyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnN1Y2Nlc3MgPiBzcGFuIHsgYmFja2dyb3VuZC1jb2xvcjogIzVkYTQyMzsgYm9yZGVyLWxlZnQtY29sb3I6ICMzOTY1MTY7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5ID4gc3BhbiB7IGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7IGJvcmRlci1sZWZ0LWNvbG9yOiAjYzNjM2MzOyB9CisuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNlY29uZGFyeSA+IGEgeyBjb2xvcjogIzFkMWQxZDsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5hbGVydCA+IGE6aG92ZXIsIC5idXR0b24uZHJvcGRvd24uc3BsaXQuYWxlcnQgPiBzcGFuOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogIzk3MGIwZTsgfQorLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zdWNjZXNzID4gYTpob3ZlciwgLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zdWNjZXNzID4gc3Bhbjpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICM0NTdhMWE7IH0KKy5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5ID4gYTpob3ZlciwgLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zZWNvbmRhcnkgPiBzcGFuOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2QwZDBkMDsgfQorCisvKiBCdXR0b24gR3JvdXBzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3VsLmJ1dHRvbi1ncm91cCB7IGxpc3Qtc3R5bGU6IG5vbmU7IHBhZGRpbmc6IDA7IG1hcmdpbjogMCAwIDEycHg7ICp6b29tOiAxOyB9Cit1bC5idXR0b24tZ3JvdXA6YmVmb3JlLCB1bC5idXR0b24tZ3JvdXA6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogdGFibGU7IH0KK3VsLmJ1dHRvbi1ncm91cDphZnRlciB7IGNsZWFyOiBib3RoOyB9Cit1bC5idXR0b24tZ3JvdXAgbGkgeyBwYWRkaW5nOiAwOyBtYXJnaW46IDAgMCAwIC0xcHg7IGZsb2F0OiBsZWZ0OyB9Cit1bC5idXR0b24tZ3JvdXAgbGk6Zmlyc3QtY2hpbGQgeyBtYXJnaW4tbGVmdDogMDsgfQordWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaSBhLmJ1dHRvbiwgdWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaSBhLmJ1dHRvbi5yYWRpdXMsIHVsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGkgYS5idXR0b24tcm91bmRlZCB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDBweDsgLW8tYm9yZGVyLXJhZGl1czogMHB4OyBib3JkZXItcmFkaXVzOiAwcHg7IH0KK3VsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGk6Zmlyc3QtY2hpbGQgYS5idXR0b24sIHVsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGk6Zmlyc3QtY2hpbGQgYS5idXR0b24ucmFkaXVzIHsgLW1vei1ib3JkZXItcmFkaXVzLWxlZnQzcHg6IDVweDsgLXdlYmtpdC1ib3JkZXItbGVmdC0zcHgtcmFkaXVzOiA1cHg7IGJvcmRlci1sZWZ0LTNweC1yYWRpdXM6IDVweDsgfQordWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpmaXJzdC1jaGlsZCBhLmJ1dHRvbi5yb3VuZGVkIHsgLW1vei1ib3JkZXItcmFkaXVzLWxlZnQxMDAwcHg6IDVweDsgLXdlYmtpdC1ib3JkZXItbGVmdC0xMDAwcHgtcmFkaXVzOiA1cHg7IGJvcmRlci1sZWZ0LTEwMDBweC1yYWRpdXM6IDVweDsgfQordWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpsYXN0LWNoaWxkIGEuYnV0dG9uLCB1bC5idXR0b24tZ3JvdXAucmFkaXVzIGxpOmxhc3QtY2hpbGQgYS5idXR0b24ucmFkaXVzIHsgLW1vei1ib3JkZXItcmFkaXVzLXJpZ2h0M3B4OiA1cHg7IC13ZWJraXQtYm9yZGVyLXJpZ2h0LTNweC1yYWRpdXM6IDVweDsgYm9yZGVyLXJpZ2h0LTNweC1yYWRpdXM6IDVweDsgfQordWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpsYXN0LWNoaWxkIGEuYnV0dG9uLnJvdW5kZWQgeyAtbW96LWJvcmRlci1yYWRpdXMtcmlnaHQxMDAwcHg6IDVweDsgLXdlYmtpdC1ib3JkZXItcmlnaHQtMTAwMHB4LXJhZGl1czogNXB4OyBib3JkZXItcmlnaHQtMTAwMHB4LXJhZGl1czogNXB4OyB9Cit1bC5idXR0b24tZ3JvdXAuZXZlbiBhLmJ1dHRvbiB7IHdpZHRoOiAxMDAlOyB9Cit1bC5idXR0b24tZ3JvdXAuZXZlbi50d28tdXAgbGkgeyB3aWR0aDogNTAlOyB9Cit1bC5idXR0b24tZ3JvdXAuZXZlbi50aHJlZS11cCBsaSB7IHdpZHRoOiAzMy4zJTsgfQordWwuYnV0dG9uLWdyb3VwLmV2ZW4udGhyZWUtdXAgbGk6Zmlyc3QtY2hpbGQgeyB3aWR0aDogMzMuNCU7IH0KK3VsLmJ1dHRvbi1ncm91cC5ldmVuLmZvdXItdXAgbGkgeyB3aWR0aDogMjUlOyB9Cit1bC5idXR0b24tZ3JvdXAuZXZlbi5maXZlLXVwIGxpIHsgd2lkdGg6IDIwJTsgfQorCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IC5idXR0b24tZ3JvdXAgYnV0dG9uLmJ1dHRvbiwgLmJ1dHRvbi1ncm91cCBpbnB1dFt0eXBlPSJzdWJtaXQiXS5idXR0b24geyB3aWR0aDogYXV0bzsgcGFkZGluZzogMTBweCAyMHB4IDExcHg7IH0KKyAgLmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLmxhcmdlLCAuYnV0dG9uLWdyb3VwIGlucHV0W3R5cGU9InN1Ym1pdCJdLmJ1dHRvbi5sYXJnZSB7IHBhZGRpbmc6IDE1cHggMzBweCAxNnB4OyB9CisgIC5idXR0b24tZ3JvdXAgYnV0dG9uLmJ1dHRvbi5tZWRpdW0sIC5idXR0b24tZ3JvdXAgaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uLm1lZGl1bSB7IHBhZGRpbmc6IDEwcHggMjBweCAxMXB4OyB9CisgIC5idXR0b24tZ3JvdXAgYnV0dG9uLmJ1dHRvbi5zbWFsbCwgLmJ1dHRvbi1ncm91cCBpbnB1dFt0eXBlPSJzdWJtaXQiXS5idXR0b24uc21hbGwgeyBwYWRkaW5nOiA3cHggMTRweCA4cHg7IH0KKyAgLmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLnRpbnksIC5idXR0b24tZ3JvdXAgaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uLnRpbnkgeyBwYWRkaW5nOiA1cHggMTBweCA2cHg7IH0KKyAgLmJ1dHRvbi1ncm91cC5ldmVuIGJ1dHRvbi5idXR0b24sIC5idXR0b24tZ3JvdXAuZXZlbiBpbnB1dFt0eXBlPSJzdWJtaXQiXS5idXR0b24geyB3aWR0aDogMTAwJTsgcGFkZGluZy1sZWZ0OiAwOyBwYWRkaW5nLXJpZ2h0OiAwOyB9IH0KK2Rpdi5idXR0b24tYmFyIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfQorZGl2LmJ1dHRvbi1iYXIgdWwuYnV0dG9uLWdyb3VwIHsgZmxvYXQ6IGxlZnQ7IG1hcmdpbi1yaWdodDogOHB4OyB9CitkaXYuYnV0dG9uLWJhciB1bC5idXR0b24tZ3JvdXA6bGFzdC1jaGlsZCB7IG1hcmdpbi1sZWZ0OiAwOyB9CisKKy8qIENTUyBmb3IgalF1ZXJ5IFJldmVhbCBQbHVnaW4gTWFpbnRhaW5lZCBmb3IgRm91bmRhdGlvbi4gZm91bmRhdGlvbi56dXJiLmNvbSBGcmVlIHRvIHVzZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwICovCisvKiBSZXZlYWwgTW9kYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy5yZXZlYWwtbW9kYWwtYmcgeyBwb3NpdGlvbjogZml4ZWQ7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IGJhY2tncm91bmQ6ICMwMDA7IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40NSk7IHotaW5kZXg6IDQwOyBkaXNwbGF5OiBub25lOyB0b3A6IDA7IGxlZnQ6IDA7IH0KKworLnJldmVhbC1tb2RhbCB7IGJhY2tncm91bmQ6IHdoaXRlOyB2aXNpYmlsaXR5OiBoaWRkZW47IGRpc3BsYXk6IG5vbmU7IHRvcDogMTAwcHg7IGxlZnQ6IDUwJTsgbWFyZ2luLWxlZnQ6IC0yNjBweDsgd2lkdGg6IDUyMHB4OyBwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IDQxOyBwYWRkaW5nOiAzMHB4OyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC40KTsgLW1vei1ib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDAsIDAsIDAuNCk7IGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC40KTsgfQorLnJldmVhbC1tb2RhbCAqOmZpcnN0LWNoaWxkIHsgbWFyZ2luLXRvcDogMDsgfQorLnJldmVhbC1tb2RhbCAqOmxhc3QtY2hpbGQgeyBtYXJnaW4tYm90dG9tOiAwOyB9CisucmV2ZWFsLW1vZGFsIC5jbG9zZS1yZXZlYWwtbW9kYWwgeyBmb250LXNpemU6IDIycHg7IGZvbnQtc2l6ZTogMi4ycmVtOyBsaW5lLWhlaWdodDogLjU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA4cHg7IHJpZ2h0OiAxMXB4OyBjb2xvcjogI2FhYTsgdGV4dC1zaGFkb3c6IDAgLTFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjYpOyBmb250LXdlaWdodDogYm9sZDsgY3Vyc29yOiBwb2ludGVyOyB9CisucmV2ZWFsLW1vZGFsLnNtYWxsIHsgd2lkdGg6IDMwJTsgbWFyZ2luLWxlZnQ6IC0xNSU7IH0KKy5yZXZlYWwtbW9kYWwubWVkaXVtIHsgd2lkdGg6IDQwJTsgbWFyZ2luLWxlZnQ6IC0yMCU7IH0KKy5yZXZlYWwtbW9kYWwubGFyZ2UgeyB3aWR0aDogNjAlOyBtYXJnaW4tbGVmdDogLTMwJTsgfQorLnJldmVhbC1tb2RhbC54bGFyZ2UgeyB3aWR0aDogNzAlOyBtYXJnaW4tbGVmdDogLTM1JTsgfQorLnJldmVhbC1tb2RhbC5leHBhbmQgeyB3aWR0aDogOTAlOyBtYXJnaW4tbGVmdDogLTQ1JTsgfQorLnJldmVhbC1tb2RhbCAucm93IHsgbWluLXdpZHRoOiAwOyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9CisKKy8qIE1vYmlsZSAqLworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyAucmV2ZWFsLW1vZGFsLWJnIHsgcG9zaXRpb246IGFic29sdXRlOyB9CisgIC5yZXZlYWwtbW9kYWwsIC5yZXZlYWwtbW9kYWwuc21hbGwsIC5yZXZlYWwtbW9kYWwubWVkaXVtLCAucmV2ZWFsLW1vZGFsLmxhcmdlLCAucmV2ZWFsLW1vZGFsLnhsYXJnZSB7IHdpZHRoOiA4MCU7IHRvcDogMTVweDsgbGVmdDogNTAlOyBtYXJnaW4tbGVmdDogLTQwJTsgcGFkZGluZzogMjBweDsgaGVpZ2h0OiBhdXRvOyB9IH0KKyAgLyogTk9URVMgQ2xvc2UgYnV0dG9uIGVudGl0eSBpcyAmIzIxNTsKKyBFeGFtcGxlIG1hcmt1cCA8ZGl2IGlkPSJteU1vZGFsIiBjbGFzcz0icmV2ZWFsLW1vZGFsIj4gPGgyPkF3ZXNvbWUuIEkgaGF2ZSBpdC48L2gyPiA8cCBjbGFzcz0ibGVhZCI+WW91ciBjb3VjaC4gIEkgaXQncyBtaW5lLjwvcD4gPHA+TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gSW4gdWx0cmljZXMgYWxpcXVldCBwbGFjZXJhdC4gRHVpcyBwdWx2aW5hciBvcmNpIGV0IG5pc2kgZXVpc21vZCB2aXRhZSB0ZW1wdXMgbG9yZW0gY29uc2VjdGV0dXIuIER1aXMgYXQgbWFnbmEgcXVpcyB0dXJwaXMgbWF0dGlzIHZlbmVuYXRpcyBlZ2V0IGlkIGRpYW0uIDwvcD4gPGEgY2xhc3M9ImNsb3NlLXJldmVhbC1tb2RhbCI+JiMyMTU7PC9hPiA8L2Rpdj4gKi8KKy8qIFJlcXVpcmVzIC1nbG9iYWxzLmNzcyAtYXBwLmpzICovCisvKiBUYWJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2RsLnRhYnMgeyBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2U2ZTZlNjsgZGlzcGxheTogYmxvY2s7IGhlaWdodDogNDBweDsgcGFkZGluZzogMDsgbWFyZ2luLWJvdHRvbTogMjBweDsgfQorZGwudGFicy5jb250YWluZWQgeyBtYXJnaW4tYm90dG9tOiAwOyB9CitkbC50YWJzIGR0IHsgY29sb3I6ICNiM2IzYjM7IGN1cnNvcjogZGVmYXVsdDsgZGlzcGxheTogYmxvY2s7IGZsb2F0OiBsZWZ0OyBmb250LXNpemU6IDEycHg7IGhlaWdodDogNDBweDsgbGluZS1oZWlnaHQ6IDQwcHg7IHBhZGRpbmc6IDA7IHBhZGRpbmctcmlnaHQ6IDlweDsgcGFkZGluZy1sZWZ0OiAyMHB4OyB3aWR0aDogYXV0bzsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfQorZGwudGFicyBkdDpmaXJzdC1jaGlsZCB7IHBhZGRpbmc6IDA7IHBhZGRpbmctcmlnaHQ6IDlweDsgfQorZGwudGFicyBkZCB7IGRpc3BsYXk6IGJsb2NrOyBmbG9hdDogbGVmdDsgcGFkZGluZzogMDsgbWFyZ2luOiAwOyB9CitkbC50YWJzIGRkIGEgeyBjb2xvcjogIzZmNmY2ZjsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMTRweDsgaGVpZ2h0OiA0MHB4OyBsaW5lLWhlaWdodDogNDBweDsgcGFkZGluZzogMHB4IDIzLjhweDsgfQorZGwudGFicyBkZCBhOmZvY3VzIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjZmQ3ODAwOyB9CitkbC50YWJzIGRkLmFjdGl2ZSB7IGJvcmRlci10b3A6IDNweCBzb2xpZCAjZmQ3ODAwOyBtYXJnaW4tdG9wOiAtM3B4OyB9CitkbC50YWJzIGRkLmFjdGl2ZSBhIHsgY3Vyc29yOiBkZWZhdWx0OyBjb2xvcjogIzNjM2MzYzsgYmFja2dyb3VuZDogI2ZmZjsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZTZlNmU2OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZTZlNmU2OyBmb250LXdlaWdodDogYm9sZDsgfQorZGwudGFicyBkZDpmaXJzdC1jaGlsZCB7IG1hcmdpbi1sZWZ0OiAwOyB9CitkbC50YWJzLnZlcnRpY2FsIHsgaGVpZ2h0OiBhdXRvOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U2ZTZlNjsgfQorZGwudGFicy52ZXJ0aWNhbCBkdCwgZGwudGFicy52ZXJ0aWNhbCBkZCB7IGZsb2F0OiBub25lOyBoZWlnaHQ6IGF1dG87IH0KK2RsLnRhYnMudmVydGljYWwgZGQgeyBib3JkZXItbGVmdDogM3B4IHNvbGlkICNjY2NjY2M7IH0KK2RsLnRhYnMudmVydGljYWwgZGQgYSB7IGJhY2tncm91bmQ6ICNmMmYyZjI7IGJvcmRlcjogbm9uZTsgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsgYm9yZGVyLXdpZHRoOiAxcHggMXB4IDAgMDsgY29sb3I6ICM1NTU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDE0cHg7IGhlaWdodDogYXV0bzsgbGluZS1oZWlnaHQ6IDE7IHBhZGRpbmc6IDE1cHggMjBweDsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgLW1vei1ib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgYm94LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IH0KK2RsLnRhYnMudmVydGljYWwgZGQuYWN0aXZlIHsgbWFyZ2luLXRvcDogMDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM0ZDRkNGQ7IGJvcmRlci1sZWZ0OiA0cHggc29saWQgIzFhMWExYTsgfQorZGwudGFicy52ZXJ0aWNhbCBkZC5hY3RpdmUgYSB7IGJhY2tncm91bmQ6ICM0ZDRkNGQ7IGJvcmRlcjogbm9uZTsgY29sb3I6ICNmZmY7IGhlaWdodDogYXV0bzsgbWFyZ2luOiAwOyBwb3NpdGlvbjogc3RhdGljOyB0b3A6IDA7IC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDA7IC1tb3otYm94LXNoYWRvdzogMCAwIDA7IGJveC1zaGFkb3c6IDAgMCAwOyB9CitkbC50YWJzLnZlcnRpY2FsIGRkOmZpcnN0LWNoaWxkIGEuYWN0aXZlIHsgbWFyZ2luOiAwOyB9CitkbC50YWJzLnBpbGwgeyBib3JkZXItYm90dG9tOiBub25lOyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9CitkbC50YWJzLnBpbGwgZGQgeyBtYXJnaW4tcmlnaHQ6IDEwcHg7IH0KK2RsLnRhYnMucGlsbCBkZDpsYXN0LWNoaWxkIHsgbWFyZ2luLXJpZ2h0OiAwOyB9CitkbC50YWJzLnBpbGwgZGQgYSB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMTAwMHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW8tYm9yZGVyLXJhZGl1czogMTAwMHB4OyBib3JkZXItcmFkaXVzOiAxMDAwcHg7IGJhY2tncm91bmQ6ICNlNmU2ZTY7IGhlaWdodDogMjZweDsgbGluZS1oZWlnaHQ6IDI2cHg7IGNvbG9yOiAjNjY2OyB9CitkbC50YWJzLnBpbGwgZGQuYWN0aXZlIHsgYm9yZGVyOiBub25lOyBtYXJnaW4tdG9wOiAwOyB9CitkbC50YWJzLnBpbGwgZGQuYWN0aXZlIGEgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQ3ODAwOyBib3JkZXI6IG5vbmU7IGNvbG9yOiAjZmZmOyB9CitkbC50YWJzLnBpbGwuY29udGFpbmVkIHsgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNlZWU7IG1hcmdpbi1ib3R0b206IDA7IH0KK2RsLnRhYnMucGlsbC50d28tdXAgZGQsIGRsLnRhYnMucGlsbC50aHJlZS11cCBkZCwgZGwudGFicy5waWxsLmZvdXItdXAgZGQsIGRsLnRhYnMucGlsbC5maXZlLXVwIGRkIHsgbWFyZ2luLXJpZ2h0OiAwOyB9CitkbC50YWJzLnR3by11cCBkdCBhLCBkbC50YWJzLnR3by11cCBkZCBhLCBkbC50YWJzLnRocmVlLXVwIGR0IGEsIGRsLnRhYnMudGhyZWUtdXAgZGQgYSwgZGwudGFicy5mb3VyLXVwIGR0IGEsIGRsLnRhYnMuZm91ci11cCBkZCBhLCBkbC50YWJzLmZpdmUtdXAgZHQgYSwgZGwudGFicy5maXZlLXVwIGRkIGEgeyBwYWRkaW5nOiAwIDE3cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgb3ZlcmZsb3c6IGhpZGRlbjsgfQorZGwudGFicy50d28tdXAgZHQsIGRsLnRhYnMudHdvLXVwIGRkIHsgd2lkdGg6IDUwJTsgfQorZGwudGFicy50aHJlZS11cCBkdCwgZGwudGFicy50aHJlZS11cCBkZCB7IHdpZHRoOiAzMy4zMyU7IH0KK2RsLnRhYnMuZm91ci11cCBkdCwgZGwudGFicy5mb3VyLXVwIGRkIHsgd2lkdGg6IDI1JTsgfQorZGwudGFicy5maXZlLXVwIGR0LCBkbC50YWJzLmZpdmUtdXAgZGQgeyB3aWR0aDogMjAlOyB9CisKK3VsLnRhYnMtY29udGVudCB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDAgMCAyMHB4OyBwYWRkaW5nOiAwOyB9Cit1bC50YWJzLWNvbnRlbnQgPiBsaSB7IGRpc3BsYXk6IG5vbmU7IH0KK3VsLnRhYnMtY29udGVudCA+IGxpLmFjdGl2ZSB7IGRpc3BsYXk6IGJsb2NrOyB9Cit1bC50YWJzLWNvbnRlbnQuY29udGFpbmVkIHsgcGFkZGluZzogMDsgfQordWwudGFicy1jb250ZW50LmNvbnRhaW5lZCA+IGxpIHsgYm9yZGVyOiBzb2xpZCAwICNlNmU2ZTY7IGJvcmRlci13aWR0aDogMCAxcHggMXB4IDFweDsgcGFkZGluZzogMjBweDsgfQordWwudGFicy1jb250ZW50LmNvbnRhaW5lZC52ZXJ0aWNhbCA+IGxpIHsgYm9yZGVyLXdpZHRoOiAxcHggMXB4IDFweCAxcHg7IH0KKworLm5vLWpzIHVsLnRhYnMtY29udGVudCA+IGxpIHsgZGlzcGxheTogYmxvY2s7IH0KKworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyBkbC50YWJzLm1vYmlsZSB7IHdpZHRoOiBhdXRvOyBtYXJnaW46IDIwcHggLTIwcHggNDBweDsgaGVpZ2h0OiBhdXRvOyB9CisgIGRsLnRhYnMubW9iaWxlIGR0LCBkbC50YWJzLm1vYmlsZSBkZCB7IGZsb2F0OiBub25lOyBoZWlnaHQ6IGF1dG87IH0KKyAgZGwudGFicy5tb2JpbGUgZGQgYSB7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogYXV0bzsgaGVpZ2h0OiBhdXRvOyBwYWRkaW5nOiAxOHB4IDIwcHg7IGxpbmUtaGVpZ2h0OiAxOyBib3JkZXI6IHNvbGlkIDAgI2NjYzsgYm9yZGVyLXdpZHRoOiAxcHggMCAwOyBtYXJnaW46IDA7IGNvbG9yOiAjNTU1OyBiYWNrZ3JvdW5kOiAjZWVlOyBmb250LXNpemU6IDE1cHg7IGZvbnQtc2l6ZTogMS41cmVtOyB9CisgIGRsLnRhYnMubW9iaWxlIGRkIGEuYWN0aXZlIHsgaGVpZ2h0OiBhdXRvOyBtYXJnaW46IDA7IGJvcmRlci13aWR0aDogMXB4IDAgMDsgfQorICAudGFicy5tb2JpbGUgeyBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2NjYzsgaGVpZ2h0OiBhdXRvOyB9CisgIC50YWJzLm1vYmlsZSBkZCBhIHsgcGFkZGluZzogMThweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1sZWZ0OiBub25lOyBib3JkZXItcmlnaHQ6IG5vbmU7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOyBiYWNrZ3JvdW5kOiAjZmZmOyB9CisgIC50YWJzLm1vYmlsZSBkZCBhLmFjdGl2ZSB7IGJvcmRlcjogbm9uZTsgYmFja2dyb3VuZDogI2ZkNzgwMDsgY29sb3I6ICNmZmY7IG1hcmdpbjogMDsgcG9zaXRpb246IHN0YXRpYzsgdG9wOiAwOyBoZWlnaHQ6IGF1dG87IH0KKyAgLnRhYnMubW9iaWxlIGRkOmZpcnN0LWNoaWxkIGEuYWN0aXZlIHsgbWFyZ2luOiAwOyB9CisgIGRsLmNvbnRhaW5lZC5tb2JpbGUgeyBtYXJnaW4tYm90dG9tOiAwOyB9CisgIGRsLmNvbnRhaW5lZC50YWJzLm1vYmlsZSBkZCBhIHsgcGFkZGluZzogMThweCAyMHB4OyB9CisgIGRsLnRhYnMubW9iaWxlICsgdWwuY29udGFpbmVkIHsgbWFyZ2luLWxlZnQ6IC0yMHB4OyBtYXJnaW4tcmlnaHQ6IC0yMHB4OyBib3JkZXItd2lkdGg6IDAgMCAxcHggMDsgfSB9CisvKiBSZXF1aXJlczogZ2xvYmFscy5jc3MgKi8KKy8qIFRhYmxlIG9mIENvbnRlbnRzCisKKzo6IFZpc2liaWxpdHkKKzo6IEFsZXJ0cworOjogTGFiZWxzCis6OiBUb29sdGlwcworOjogUGFuZWxzCis6OiBBY2NvcmRpb24KKzo6IFNpZGUgTmF2Cis6OiBTdWIgTmF2Cis6OiBQYWdpbmF0aW9uCis6OiBCcmVhZGNydW1icworOjogTGlzdHMKKzo6IExpbmsgTGlzdHMKKzo6IEtleXN0cm9rZSBDaGFycworOjogSW1hZ2UgVGh1bWJuYWlscworOjogVmlkZW8KKzo6IFRhYmxlcworOjogTWljcm9mb3JtYXRzCis6OiBQcm9ncmVzcyBCYXJzCisKKyovCisvKiBWaXNpYmlsaXR5IENsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU3RhbmRhcmQgKGxhcmdlKSBkaXNwbGF5IHRhcmdldGluZyAqLworLnNob3ctZm9yLXNtYWxsLCAuc2hvdy1mb3ItbWVkaXVtLCAuc2hvdy1mb3ItbWVkaXVtLWRvd24sIC5oaWRlLWZvci1sYXJnZSwgLmhpZGUtZm9yLWxhcmdlLXVwLCAuc2hvdy1mb3IteGxhcmdlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9CisKKy5oaWRlLWZvci14bGFyZ2UsIC5zaG93LWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuaGlkZS1mb3Itc21hbGwsIC5oaWRlLWZvci1tZWRpdW0sIC5oaWRlLWZvci1tZWRpdW0tZG93biB7IGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IH0KKworLyogVmVyeSBsYXJnZSBkaXNwbGF5IHRhcmdldGluZyAqLworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxNDQxcHgpIHsgLmhpZGUtZm9yLXNtYWxsLCAuaGlkZS1mb3ItbWVkaXVtLCAuaGlkZS1mb3ItbWVkaXVtLWRvd24sIC5oaWRlLWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuc2hvdy1mb3IteGxhcmdlIHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQorICAuc2hvdy1mb3Itc21hbGwsIC5zaG93LWZvci1tZWRpdW0sIC5zaG93LWZvci1tZWRpdW0tZG93biwgLnNob3ctZm9yLWxhcmdlLCAuaGlkZS1mb3ItbGFyZ2UtdXAsIC5oaWRlLWZvci14bGFyZ2UgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfQorLyogTWVkaXVtIGRpc3BsYXkgdGFyZ2V0aW5nICovCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEyNzlweCkgYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7IC5oaWRlLWZvci1zbWFsbCwgLnNob3ctZm9yLW1lZGl1bSwgLnNob3ctZm9yLW1lZGl1bS1kb3duLCAuaGlkZS1mb3ItbGFyZ2UsIC5oaWRlLWZvci1sYXJnZS11cCwgLmhpZGUtZm9yLXhsYXJnZSB7IGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IH0KKyAgLnNob3ctZm9yLXNtYWxsLCAuaGlkZS1mb3ItbWVkaXVtLCAuaGlkZS1mb3ItbWVkaXVtLWRvd24sIC5zaG93LWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuc2hvdy1mb3IteGxhcmdlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KKy8qIFNtYWxsIGRpc3BsYXkgdGFyZ2V0aW5nICovCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IC5zaG93LWZvci1zbWFsbCwgLmhpZGUtZm9yLW1lZGl1bSwgLnNob3ctZm9yLW1lZGl1bS1kb3duLCAuaGlkZS1mb3ItbGFyZ2UsIC5oaWRlLWZvci1sYXJnZS11cCwgLmhpZGUtZm9yLXhsYXJnZSB7IGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IH0KKyAgLmhpZGUtZm9yLXNtYWxsLCAuc2hvdy1mb3ItbWVkaXVtLCAuaGlkZS1mb3ItbWVkaXVtLWRvd24sIC5zaG93LWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuc2hvdy1mb3IteGxhcmdlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KKy8qIE9yaWVudGF0aW9uIHRhcmdldGluZyAqLworLnNob3ctZm9yLWxhbmRzY2FwZSwgLmhpZGUtZm9yLXBvcnRyYWl0IHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQorCisuaGlkZS1mb3ItbGFuZHNjYXBlLCAuc2hvdy1mb3ItcG9ydHJhaXQgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KKworQG1lZGlhIHNjcmVlbiBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIHsgLnNob3ctZm9yLWxhbmRzY2FwZSwgLmhpZGUtZm9yLXBvcnRyYWl0IHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQorICAuaGlkZS1mb3ItbGFuZHNjYXBlLCAuc2hvdy1mb3ItcG9ydHJhaXQgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfQorQG1lZGlhIHNjcmVlbiBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCkgeyAuc2hvdy1mb3ItcG9ydHJhaXQsIC5oaWRlLWZvci1sYW5kc2NhcGUgeyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9CisgIC5oaWRlLWZvci1wb3J0cmFpdCwgLnNob3ctZm9yLWxhbmRzY2FwZSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSB9CisvKiBUb3VjaC1lbmFibGVkIGRldmljZSB0YXJnZXRpbmcgKi8KKy5zaG93LWZvci10b3VjaCB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQorCisuaGlkZS1mb3ItdG91Y2ggeyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9CisKKy50b3VjaCAuc2hvdy1mb3ItdG91Y2ggeyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9CisKKy50b3VjaCAuaGlkZS1mb3ItdG91Y2ggeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KKworLyogU3BlY2lmaWMgb3ZlcnJpZGVzIGZvciBlbGVtZW50cyB0aGF0IHJlcXVpcmUgc29tZXRoaW5nIG90aGVyIHRoYW4gZGlzcGxheTogYmxvY2sgKi8KK3RhYmxlLnNob3ctZm9yLXhsYXJnZSwgdGFibGUuc2hvdy1mb3ItbGFyZ2UsIHRhYmxlLmhpZGUtZm9yLXNtYWxsLCB0YWJsZS5oaWRlLWZvci1tZWRpdW0geyBkaXNwbGF5OiB0YWJsZSAhaW1wb3J0YW50OyB9CisKK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTI3OXB4KSBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsgLnRvdWNoIHRhYmxlLmhpZGUtZm9yLXhsYXJnZSwgLnRvdWNoIHRhYmxlLmhpZGUtZm9yLWxhcmdlLCAudG91Y2ggdGFibGUuaGlkZS1mb3Itc21hbGwsIC50b3VjaCB0YWJsZS5zaG93LWZvci1tZWRpdW0geyBkaXNwbGF5OiB0YWJsZSAhaW1wb3J0YW50OyB9IH0KK0BtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsgdGFibGUuaGlkZS1mb3IteGxhcmdlLCB0YWJsZS5oaWRlLWZvci1sYXJnZSwgdGFibGUuaGlkZS1mb3ItbWVkaXVtLCB0YWJsZS5zaG93LWZvci1zbWFsbCB7IGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7IH0gfQorLyogQWxlcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2Rpdi5hbGVydC1ib3ggeyBkaXNwbGF5OiBibG9jazsgcGFkZGluZzogNnB4IDdweCA3cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogI2ZkNzgwMDsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpOyBtYXJnaW4tYm90dG9tOiAxMnB4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAzcHg7IC1vLWJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyLXJhZGl1czogM3B4OyB0ZXh0LXNoYWRvdzogMCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4zKTsgcG9zaXRpb246IHJlbGF0aXZlOyB9CitkaXYuYWxlcnQtYm94LnN1Y2Nlc3MgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNWRhNDIzOyBjb2xvcjogI2ZmZjsgdGV4dC1zaGFkb3c6IDAgLTFweCByZ2JhKDAsIDAsIDAsIDAuMyk7IH0KK2Rpdi5hbGVydC1ib3guYWxlcnQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYzYwZjEzOyBjb2xvcjogI2ZmZjsgdGV4dC1zaGFkb3c6IDAgLTFweCByZ2JhKDAsIDAsIDAsIDAuMyk7IH0KK2Rpdi5hbGVydC1ib3guc2Vjb25kYXJ5IHsgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsgY29sb3I6ICM1MDUwNTA7IHRleHQtc2hhZG93OiAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7IH0KK2Rpdi5hbGVydC1ib3ggYS5jbG9zZSB7IGNvbG9yOiAjMzMzOyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiA0cHg7IHRvcDogLTFweDsgZm9udC1zaXplOiAxN3B4OyBvcGFjaXR5OiAwLjI7IHBhZGRpbmc6IDRweDsgfQorZGl2LmFsZXJ0LWJveCBhLmNsb3NlOmhvdmVyLCBkaXYuYWxlcnQtYm94IGEuY2xvc2U6Zm9jdXMgeyBvcGFjaXR5OiAwLjQ7IH0KKworLyogTGFiZWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiBUb29sdGlwcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisuaGFzLXRpcCB7IGJvcmRlci1ib3R0b206IGRvdHRlZCAxcHggI2NjY2NjYzsgY3Vyc29yOiBoZWxwOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMzMzMzMzM7IH0KKy5oYXMtdGlwOmhvdmVyIHsgYm9yZGVyLWJvdHRvbTogZG90dGVkIDFweCAjMTk2MTc3OyBjb2xvcjogI2ZkNzgwMDsgfQorLmhhcy10aXAudGlwLWxlZnQsIC5oYXMtdGlwLnRpcC1yaWdodCB7IGZsb2F0OiBub25lICFpbXBvcnRhbnQ7IH0KKworLnRvb2x0aXAgeyBkaXNwbGF5OiBub25lOyBiYWNrZ3JvdW5kOiBibGFjazsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjg1KTsgcG9zaXRpb246IGFic29sdXRlOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDEycHg7IGZvbnQtc2l6ZTogMS4ycmVtOyBwYWRkaW5nOiA1cHg7IHotaW5kZXg6IDk5OTsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7IC1tb3otYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGxpbmUtaGVpZ2h0OiBub3JtYWw7IH0KKy50b29sdGlwID4gLm51YiB7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDVweDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCBibGFjayB0cmFuc3BhcmVudDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCByZ2JhKDAsIDAsIDAsIDAuODUpIHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwcHg7IGxlZnQ6IDEwcHg7IH0KKy50b29sdGlwLnRpcC1vdmVycmlkZSA+IC5udWIgeyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IGJsYWNrIHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgcmdiYSgwLCAwLCAwLCAwLjg1KSB0cmFuc3BhcmVudCAhaW1wb3J0YW50OyB0b3A6IC0xMHB4ICFpbXBvcnRhbnQ7IH0KKy50b29sdGlwLnRpcC10b3AgPiAubnViIHsgYm9yZGVyLWNvbG9yOiBibGFjayB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuODUpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyB0b3A6IGF1dG87IGJvdHRvbTogLTEwcHg7IH0KKy50b29sdGlwLnRpcC1sZWZ0LCAudG9vbHRpcC50aXAtcmlnaHQgeyBmbG9hdDogbm9uZSAhaW1wb3J0YW50OyB9CisudG9vbHRpcC50aXAtbGVmdCA+IC5udWIgeyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IGJsYWNrOyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHJnYmEoMCwgMCwgMCwgMC44NSk7IHJpZ2h0OiAtMTBweDsgbGVmdDogYXV0bzsgfQorLnRvb2x0aXAudGlwLXJpZ2h0ID4gLm51YiB7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgYmxhY2sgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgcmdiYSgwLCAwLCAwLCAwLjg1KSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgcmlnaHQ6IGF1dG87IGxlZnQ6IC0xMHB4OyB9CisudG9vbHRpcC5ub3JhZGl1cyB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsgLW1vei1ib3JkZXItcmFkaXVzOiAwOyAtbXMtYm9yZGVyLXJhZGl1czogMDsgLW8tYm9yZGVyLXJhZGl1czogMDsgYm9yZGVyLXJhZGl1czogMDsgfQorLnRvb2x0aXAub3BlbmVkIHsgY29sb3I6ICNmZDc4MDAgIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbTogZG90dGVkIDFweCAjMTk2MTc3ICFpbXBvcnRhbnQ7IH0KKworLnRhcC10by1jbG9zZSB7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDEwcHg7IGZvbnQtc2l6ZTogMXJlbTsgY29sb3I6ICM4ODg4ODg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0KKworQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyAudG9vbHRpcCB7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1zaXplOiAxLjRyZW07IGxpbmUtaGVpZ2h0OiAxLjQ7IHBhZGRpbmc6IDdweCAxMHB4IDlweCAxMHB4OyB9CisgIC50b29sdGlwID4gLm51YiwgLnRvb2x0aXAudG9wID4gLm51YiwgLnRvb2x0aXAubGVmdCA+IC5udWIsIC50b29sdGlwLnJpZ2h0ID4gLm51YiB7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgYmxhY2sgdHJhbnNwYXJlbnQ7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgcmdiYSgwLCAwLCAwLCAwLjg1KSB0cmFuc3BhcmVudDsgdG9wOiAtMTJweDsgbGVmdDogMTBweDsgfSB9CisvKiBQYW5lbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLnBhbmVsIHsgYmFja2dyb3VuZDogI2YyZjJmMjsgYm9yZGVyOiBzb2xpZCAxcHggI2U2ZTZlNjsgbWFyZ2luOiAwIDAgMjJweCAwOyBwYWRkaW5nOiAyMHB4OyB9CisucGFuZWwgPiA6Zmlyc3QtY2hpbGQgeyBtYXJnaW4tdG9wOiAwOyB9CisucGFuZWwgPiA6bGFzdC1jaGlsZCB7IG1hcmdpbi1ib3R0b206IDA7IH0KKy5wYW5lbC5jYWxsb3V0IHsgYmFja2dyb3VuZDogI2ZkNzgwMDsgY29sb3I6ICNmZmY7IGJvcmRlci1jb2xvcjogIzIyODRhMTsgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwcHggMXB4IDBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7IC1tb3otYm94LXNoYWRvdzogaW5zZXQgMHB4IDFweCAwcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpOyBib3gtc2hhZG93OiBpbnNldCAwcHggMXB4IDBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7IH0KKy5wYW5lbC5jYWxsb3V0IGEgeyBjb2xvcjogI2ZmZjsgfQorLnBhbmVsLmNhbGxvdXQgLmJ1dHRvbiB7IGJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGNvbG9yOiAjZmQ3ODAwOyB0ZXh0LXNoYWRvdzogbm9uZTsgfQorLnBhbmVsLmNhbGxvdXQgLmJ1dHRvbjpob3ZlciB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsgfQorLnBhbmVsLnJhZGl1cyB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OyAtbW96LWJvcmRlci1yYWRpdXM6IDNweDsgLW1zLWJvcmRlci1yYWRpdXM6IDNweDsgLW8tYm9yZGVyLXJhZGl1czogM3B4OyBib3JkZXItcmFkaXVzOiAzcHg7IH0KKworLyogQWNjb3JkaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3VsLmFjY29yZGlvbiB7IG1hcmdpbjogMCAwIDIycHggMDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlOWU5ZTk7IH0KK3VsLmFjY29yZGlvbiA+IGxpIHsgbGlzdC1zdHlsZTogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3JkZXItdG9wOiAxcHggc29saWQgI2U5ZTllOTsgfQordWwuYWNjb3JkaW9uID4gbGkgLnRpdGxlIHsgY3Vyc29yOiBwb2ludGVyOyBiYWNrZ3JvdW5kOiAjZjZmNmY2OyBwYWRkaW5nOiAxNXB4OyBtYXJnaW46IDA7IHBvc2l0aW9uOiByZWxhdGl2ZTsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZTllOWU5OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZTllOWU5OyAtd2Via2l0LXRyYW5zaXRpb246IDAuMTVzIGJhY2tncm91bmQgbGluZWFyOyAtbW96LXRyYW5zaXRpb246IDAuMTVzIGJhY2tncm91bmQgbGluZWFyOyAtby10cmFuc2l0aW9uOiAwLjE1cyBiYWNrZ3JvdW5kIGxpbmVhcjsgdHJhbnNpdGlvbjogMC4xNXMgYmFja2dyb3VuZCBsaW5lYXI7IH0KK3VsLmFjY29yZGlvbiA+IGxpIC50aXRsZSBoMSwgdWwuYWNjb3JkaW9uID4gbGkgLnRpdGxlIGgyLCB1bC5hY2NvcmRpb24gPiBsaSAudGl0bGUgaDMsIHVsLmFjY29yZGlvbiA+IGxpIC50aXRsZSBoNCwgdWwuYWNjb3JkaW9uID4gbGkgLnRpdGxlIGg1IHsgbWFyZ2luOiAwOyB9Cit1bC5hY2NvcmRpb24gPiBsaSAudGl0bGU6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNnB4OyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50ICM5ZDlkOWQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDE1cHg7IHRvcDogMjFweDsgfQordWwuYWNjb3JkaW9uID4gbGkgLmNvbnRlbnQgeyBkaXNwbGF5OiBub25lOyBwYWRkaW5nOiAxNXB4OyB9Cit1bC5hY2NvcmRpb24gPiBsaS5hY3RpdmUgeyBib3JkZXItdG9wOiAzcHggc29saWQgI2ZkNzgwMDsgfQordWwuYWNjb3JkaW9uID4gbGkuYWN0aXZlIC50aXRsZSB7IGJhY2tncm91bmQ6IHdoaXRlOyBwYWRkaW5nLXRvcDogMTNweDsgfQordWwuYWNjb3JkaW9uID4gbGkuYWN0aXZlIC50aXRsZTphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA2cHg7IGJvcmRlci1jb2xvcjogIzlkOWQ5ZCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgfQordWwuYWNjb3JkaW9uID4gbGkuYWN0aXZlIC5jb250ZW50IHsgYmFja2dyb3VuZDogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBib3JkZXItbGVmdDogMXB4IHNvbGlkICNlOWU5ZTk7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlOWU5ZTk7IH0KKworLyogU2lkZSBOYXYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordWwuc2lkZS1uYXYgeyBkaXNwbGF5OiBibG9jazsgbGlzdC1zdHlsZTogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAxN3B4IDA7IH0KK3VsLnNpZGUtbmF2IGxpIHsgZGlzcGxheTogYmxvY2s7IGxpc3Qtc3R5bGU6IG5vbmU7IG1hcmdpbjogMCAwIDdweCAwOyB9Cit1bC5zaWRlLW5hdiBsaSBhIHsgZGlzcGxheTogYmxvY2s7IH0KK3VsLnNpZGUtbmF2IGxpLmFjdGl2ZSBhIHsgY29sb3I6ICM0ZDRkNGQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Cit1bC5zaWRlLW5hdiBsaS5kaXZpZGVyIHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNmU2ZTY7IGhlaWdodDogMDsgcGFkZGluZzogMDsgfQorCisvKiBTdWIgTmF2cyBodHRwOi8vd3d3Lnp1cmIuY29tL2FydGljbGUvMjkyL2hvdy10by1jcmVhdGUtc2ltcGxlLWFuZC1lZmZlY3RpdmUtc3ViLW5hIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2RsLnN1Yi1uYXYgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IGF1dG87IG92ZXJmbG93OiBoaWRkZW47IG1hcmdpbjogLTRweCAwIDE4cHg7IG1hcmdpbi1yaWdodDogMDsgbWFyZ2luLWxlZnQ6IC05cHg7IHBhZGRpbmctdG9wOiA0cHg7IH0KK2RsLnN1Yi1uYXYgZHQsIGRsLnN1Yi1uYXYgZGQgeyBmbG9hdDogbGVmdDsgZGlzcGxheTogaW5saW5lOyBtYXJnaW4tbGVmdDogOXB4OyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9CitkbC5zdWItbmF2IGR0IHsgY29sb3I6ICM5OTk7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0KK2RsLnN1Yi1uYXYgZGQgYSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1tb3otYm9yZGVyLXJhZGl1czogMTAwMHB4OyAtbXMtYm9yZGVyLXJhZGl1czogMTAwMHB4OyAtby1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IGJvcmRlci1yYWRpdXM6IDEwMDBweDsgfQorZGwuc3ViLW5hdiBkZC5hY3RpdmUgYSB7IGZvbnQtd2VpZ2h0OiBib2xkOyBiYWNrZ3JvdW5kOiAjZmQ3ODAwOyBjb2xvcjogI2ZmZjsgcGFkZGluZzogM3B4IDlweDsgY3Vyc29yOiBkZWZhdWx0OyB9CisKKy8qIFBhZ2luYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordWwucGFnaW5hdGlvbiB7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDI0cHg7IG1hcmdpbi1sZWZ0OiAtNXB4OyB9Cit1bC5wYWdpbmF0aW9uIGxpIHsgZmxvYXQ6IGxlZnQ7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDI0cHg7IGNvbG9yOiAjOTk5OyBmb250LXNpemU6IDE0cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IH0KK3VsLnBhZ2luYXRpb24gbGkgYSB7IGRpc3BsYXk6IGJsb2NrOyBwYWRkaW5nOiAxcHggN3B4IDFweDsgY29sb3I6ICM1NTU7IH0KK3VsLnBhZ2luYXRpb24gbGk6aG92ZXIgYSwgdWwucGFnaW5hdGlvbiBsaSBhOmZvY3VzIHsgYmFja2dyb3VuZDogI2U2ZTZlNjsgfQordWwucGFnaW5hdGlvbiBsaS51bmF2YWlsYWJsZSBhIHsgY3Vyc29yOiBkZWZhdWx0OyBjb2xvcjogIzk5OTsgfQordWwucGFnaW5hdGlvbiBsaS51bmF2YWlsYWJsZTpob3ZlciBhLCB1bC5wYWdpbmF0aW9uIGxpLnVuYXZhaWxhYmxlIGE6Zm9jdXMgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfQordWwucGFnaW5hdGlvbiBsaS5jdXJyZW50IGEgeyBiYWNrZ3JvdW5kOiAjZmQ3ODAwOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyBjdXJzb3I6IGRlZmF1bHQ7IH0KK3VsLnBhZ2luYXRpb24gbGkuY3VycmVudCBhOmhvdmVyIHsgYmFja2dyb3VuZDogI2ZkNzgwMDsgfQorCisvKiBCcmVhZGNydW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3VsLmJyZWFkY3J1bWJzIHsgZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQ6ICNmNmY2ZjY7IHBhZGRpbmc6IDZweCAxMHB4IDdweDsgYm9yZGVyOiAxcHggc29saWQgI2U5ZTllOTsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7IC1tb3otYm9yZGVyLXJhZGl1czogMnB4OyAtbXMtYm9yZGVyLXJhZGl1czogMnB4OyAtby1ib3JkZXItcmFkaXVzOiAycHg7IGJvcmRlci1yYWRpdXM6IDJweDsgb3ZlcmZsb3c6IGhpZGRlbjsgfQordWwuYnJlYWRjcnVtYnMgbGkgeyBtYXJnaW46IDA7IHBhZGRpbmc6IDAgMTJweCAwIDA7IGZsb2F0OiBsZWZ0OyBsaXN0LXN0eWxlOiBub25lOyB9Cit1bC5icmVhZGNydW1icyBsaSBhLCB1bC5icmVhZGNydW1icyBsaSBzcGFuIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgZm9udC1zaXplOiAxMXB4OyBmb250LXNpemU6IDEuMXJlbTsgcGFkZGluZy1sZWZ0OiAxMnB4OyB9Cit1bC5icmVhZGNydW1icyBsaTpmaXJzdC1jaGlsZCBhLCB1bC5icmVhZGNydW1icyBsaTpmaXJzdC1jaGlsZCBzcGFuIHsgcGFkZGluZy1sZWZ0OiAwOyB9Cit1bC5icmVhZGNydW1icyBsaTpiZWZvcmUgeyBjb250ZW50OiAiLyI7IGNvbG9yOiAjYWFhOyB9Cit1bC5icmVhZGNydW1icyBsaTpmaXJzdC1jaGlsZDpiZWZvcmUgeyBjb250ZW50OiAiICI7IH0KK3VsLmJyZWFkY3J1bWJzIGxpLmN1cnJlbnQgYSB7IGN1cnNvcjogZGVmYXVsdDsgY29sb3I6ICMzMzM7IH0KK3VsLmJyZWFkY3J1bWJzIGxpOmhvdmVyIGEsIHVsLmJyZWFkY3J1bWJzIGxpIGE6Zm9jdXMgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQordWwuYnJlYWRjcnVtYnMgbGkuY3VycmVudDpob3ZlciBhLCB1bC5icmVhZGNydW1icyBsaS5jdXJyZW50IGE6Zm9jdXMgeyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KK3VsLmJyZWFkY3J1bWJzIGxpLnVuYXZhaWxhYmxlIGEgeyBjb2xvcjogIzk5OTsgfQordWwuYnJlYWRjcnVtYnMgbGkudW5hdmFpbGFibGU6aG92ZXIgYSwgdWwuYnJlYWRjcnVtYnMgbGkudW5hdmFpbGFibGUgYTpmb2N1cyB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6ICM5OTk7IGN1cnNvcjogZGVmYXVsdDsgfQorCisvKiBMaW5rIExpc3QgKi8KK3VsLmxpbmstbGlzdCB7IG1hcmdpbjogMCAwIDE3cHggLTIycHg7IHBhZGRpbmc6IDA7IGxpc3Qtc3R5bGU6IG5vbmU7IG92ZXJmbG93OiBoaWRkZW47IH0KK3VsLmxpbmstbGlzdCBsaSB7IGxpc3Qtc3R5bGU6IG5vbmU7IGZsb2F0OiBsZWZ0OyBtYXJnaW4tbGVmdDogMjJweDsgZGlzcGxheTogYmxvY2s7IH0KK3VsLmxpbmstbGlzdCBsaSBhIHsgZGlzcGxheTogYmxvY2s7IH0KKworLyogS2V5dHJva2UgQ2hhcmFjdGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisua2V5c3Ryb2tlLCBrYmQgeyBmb250LWZhbWlseTogIkNvbnNvbGFzIiwgIk1lbmxvIiwgIkNvdXJpZXIiLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTNweDsgcGFkZGluZzogMnB4IDRweCAwcHg7IG1hcmdpbjogMDsgYmFja2dyb3VuZDogI2VkZWRlZDsgYm9yZGVyOiBzb2xpZCAxcHggI2RiZGJkYjsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7IC1tb3otYm9yZGVyLXJhZGl1czogM3B4OyAtbXMtYm9yZGVyLXJhZGl1czogM3B4OyAtby1ib3JkZXItcmFkaXVzOiAzcHg7IGJvcmRlci1yYWRpdXM6IDNweDsgfQorCisvKiBJbWFnZSBUaHVtYm5haWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy50aCB7IGRpc3BsYXk6IGJsb2NrOyB9CisudGggaW1nIHsgZGlzcGxheTogYmxvY2s7IGJvcmRlcjogc29saWQgNHB4ICNmZmY7IC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsgLW1vei1ib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpOyBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpOyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAzcHg7IC1vLWJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyLXJhZGl1czogM3B4OyAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IGJvcmRlciwgYm94LXNoYWRvdzsgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiBib3JkZXIsIGJveC1zaGFkb3c7IC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IGJvcmRlciwgYm94LXNoYWRvdzsgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYm9yZGVyLCBib3gtc2hhZG93OyAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDMwMG1zOyAtbW96LXRyYW5zaXRpb24tZHVyYXRpb246IDMwMG1zOyAtby10cmFuc2l0aW9uLWR1cmF0aW9uOiAzMDBtczsgdHJhbnNpdGlvbi1kdXJhdGlvbjogMzAwbXM7IH0KKy50aDpob3ZlciBpbWcgeyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4IHJnYmEoNDMsIDE2NiwgMjAzLCAwLjUpOyAtbW96LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4IHJnYmEoNDMsIDE2NiwgMjAzLCAwLjUpOyBib3gtc2hhZG93OiAwIDAgNnB4IDFweCByZ2JhKDQzLCAxNjYsIDIwMywgMC41KTsgfQorCisvKiBWaWRlbyAtIE1hZCBwcm9wcyB0byBodHRwOi8vd3d3LmFsaXN0YXBhcnQuY29tL2FydGljbGVzL2NyZWF0aW5nLWludHJpbnNpYy1yYXRpb3MtZm9yLXZpZGVvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisuZmxleC12aWRlbyB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZy10b3A6IDI1cHg7IHBhZGRpbmctYm90dG9tOiA2Ny41JTsgaGVpZ2h0OiAwOyBtYXJnaW4tYm90dG9tOiAxNnB4OyBvdmVyZmxvdzogaGlkZGVuOyB9CisuZmxleC12aWRlby53aWRlc2NyZWVuIHsgcGFkZGluZy1ib3R0b206IDU3LjI1JTsgfQorLmZsZXgtdmlkZW8udmltZW8geyBwYWRkaW5nLXRvcDogMDsgfQorLmZsZXgtdmlkZW8gaWZyYW1lLCAuZmxleC12aWRlbyBvYmplY3QsIC5mbGV4LXZpZGVvIGVtYmVkLCAuZmxleC12aWRlbyB2aWRlbyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB9CmRpZmYgLS1naXQgYS9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL25hbWVkX2RhdGFfZG94eWdlbi5jc3MgYi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL25hbWVkX2RhdGFfZG94eWdlbi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiY2JmNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvbmFtZWRfZGF0YV9kb3h5Z2VuLmNzcwpAQCAtMCwwICsxLDc3NiBAQAorQGltcG9ydCB1cmwoImJhc2UuY3NzIik7CisKK0BpbXBvcnQgdXJsKCJmb3VuZGF0aW9uLmNzcyIpOworCit0YWJsZSB7CisgICAgICBib3JkZXI6IDA7Cit9CisKK3ByZSB7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOworICAgIGNvbG9yOiAjMjIyOworICAgIGxpbmUtaGVpZ2h0OiAxLjBlbTsKKyAgICBib3JkZXI6IDJweCBzb2xpZCAjQzZDOUNCOworICAgIGZvbnQtc2l6ZTogMC45ZW07CisgICAgLyogbWFyZ2luOiAxLjVlbSAwIDEuNWVtIDA7ICovCisgICAgbWFyZ2luOiAwOworICAgIGJvcmRlci1yaWdodC1zdHlsZTogbm9uZTsKKyAgICBib3JkZXItbGVmdC1zdHlsZTogbm9uZTsKK30KKworLyogR2VuZXJhbCAqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKK2E6bGluayB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorYTp2aXNpdGVkIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CithOmFjdGl2ZSwKK2E6aG92ZXIgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworaDEsaDIsaDMsaDQsaDUsaDYgeworICAgIGNvbG9yOiAjMDAwOworICAgIG1hcmdpbi1ib3R0b206IDE4cHg7Cit9CisKK2gxIHsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplOiAyNHB4OyBsaW5lLWhlaWdodDogMjRweDsgIH0KK2gyIHsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgZm9udC1zaXplOiAxOHB4OyBsaW5lLWhlaWdodDogMThweDsgIH0KK2gzIHsgZm9udC13ZWlnaHQ6IGJvbGQ7ICAgZm9udC1zaXplOiAxOHB4OyBsaW5lLWhlaWdodDogMThweDsgfQoraDQgeyBmb250LXdlaWdodDogbm9ybWFsOyBmb250LXNpemU6IDE4cHg7IGxpbmUtaGVpZ2h0OiAxNzhweDsgfQorCitociB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2M2YzZjNjsKKyAgICBib3JkZXI6MDsKKyAgICBoZWlnaHQ6IDFweDsKKyAgICBtYXJnaW4tYm90dG9tOiAxOHB4OworICAgIGNsZWFyOmJvdGg7Cit9CisKK2Rpdi5ociB7CisgIGhlaWdodDogMXB4OworICBiYWNrZ3JvdW5kOiAjYzZjNmM2OworfQorCitkaXYuaHIyIHsKKyAgaGVpZ2h0OiAxcHg7CisgIGJhY2tncm91bmQ6ICNjNmM2YzY7Cit9CisKK2Rpdi5ociBociwgZGl2LmhyMiBociB7CisgIGRpc3BsYXk6IG5vbmU7Cit9CisKK3AgeworICAgIHBhZGRpbmc6IDAgMCAwLjVlbTsKKyAgICBsaW5lLWhlaWdodDoxLjZlbTsKK30KK3VsIHsKKyAgICBsaXN0LXN0eWxlOiBzcXVhcmU7CisgICAgbWFyZ2luOiAwIDAgMThweCAwOworfQorb2wgeworICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7CisgICAgbWFyZ2luOiAwIDAgMThweCAxLjVlbTsKK30KK29sIG9sIHsKKyAgICBsaXN0LXN0eWxlOnVwcGVyLWFscGhhOworfQorb2wgb2wgb2wgeworICAgIGxpc3Qtc3R5bGU6bG93ZXItcm9tYW47Cit9CitvbCBvbCBvbCBvbCB7CisgICAgbGlzdC1zdHlsZTpsb3dlci1hbHBoYTsKK30KK3VsIHVsLAorb2wgb2wsCit1bCBvbCwKK29sIHVsIHsKKyAgICBtYXJnaW4tYm90dG9tOjA7Cit9CitkbCB7CisgICAgbWFyZ2luOjAgMCAyNHB4IDA7Cit9CitkdCB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CitkZCB7CisgICAgbWFyZ2luLWJvdHRvbTogMThweDsKK30KK3N0cm9uZyB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgY29sb3I6ICMwMDA7Cit9CitjaXRlLAorZW0sCitpIHsKKyAgICBmb250LXN0eWxlOiBpdGFsaWM7CisgICAgYm9yZGVyOiBub25lOworfQorYmlnIHsKKyAgICBmb250LXNpemU6IDEzMS4yNSU7Cit9CitpbnMgeworICAgIGJhY2tncm91bmQ6ICNGRkZGQ0M7CisgICAgYm9yZGVyOiBub25lOworICAgIGNvbG9yOiAjMzMzOworfQorZGVsIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKKyAgICBjb2xvcjogIzU1NTsKK30KK2Jsb2NrcXVvdGUgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBwYWRkaW5nOiAwIDNlbTsKK30KK2Jsb2NrcXVvdGUgY2l0ZSwKK2Jsb2NrcXVvdGUgZW0sCitibG9ja3F1b3RlIGkgeworICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKK30KK3ByZSB7CisgICAgYmFja2dyb3VuZDogI2Y3ZjdmNzsKKyAgICBjb2xvcjogIzIyMjsKKyAgICBwYWRkaW5nOiAxLjVlbTsKK30KK2FiYnIsCithY3JvbnltIHsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzY2NjsKKyAgICBjdXJzb3I6IGhlbHA7Cit9CitpbnMgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KK3N1cCwKK3N1YiB7CisgICAgaGVpZ2h0OiAwOworICAgIGxpbmUtaGVpZ2h0OiAxOworICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgZm9udC1zaXplOiAxMHB4OworfQorc3VwIHsKKyAgICBib3R0b206IDFleDsKK30KK3N1YiB7CisgICAgdG9wOiAuNWV4OworfQorCitwLAordWwsCitvbCwKK2RkLAoraHIgeworICAgIG1hcmdpbi1ib3R0b206MTBweDsKK30KK3VsIHVsLAorb2wgb2wsCit1bCBvbCwKK29sIHVsIHsKKyAgICBtYXJnaW4tYm90dG9tOjA7Cit9CitwcmUsCitrYmQsCit0dCwKK3ZhciB7Cit9Citjb2RlIHsKKyAgICBmb250LXNpemU6IDEzcHg7Cit9CitzdHJvbmcsCitiLAorZHQsCit0aCB7CisgICAgY29sb3I6ICMwMDA7Cit9CisKKworLyogbWFpbl9jb250YWluZXIgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjd3JhcHBlciB7CisgICAgcGFkZGluZzogMHB4IDBweDsKKyAgICBtYXJnaW4tdG9wOiAyMHB4OworfQorCisvKiBoZWFkZXIqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNzZWFyY2gtaGVhZGVyeworICAgIG1hcmdpbi10b3A6MTVweDsKKyAgICBwYWRkaW5nLWJvdHRvbToxM3B4OworfQorCisjc2VhcmNoLWhlYWRlciAjc2VhcmNoeworICAgIGJhY2tncm91bmQ6ICMyMjI7CisKK30KKworI3NlYXJjaC1oZWFkZXIgI3NlYXJjaCAjc3sKKyAgICBiYWNrZ3JvdW5kOiAjMjIyOworICAgIGZvbnQtc2l6ZToxMnB4OworICAgIGNvbG9yOiAjYWFhOworfQorCisjaGVhZGVyX2NvbnRhaW5lcnsKKyAgICBwYWRkaW5nLWJvdHRvbTogMjVweDsKKyAgICBwYWRkaW5nLXRvcDogMHB4OworICAgIGJhY2tncm91bmQ6ICNmZmY7Cit9CisKKyNoZWFkZXIgeworCit9CisKKyNoZWFkZXIyIHsKKworfQorCisjY29udGVudF9jb250YWluZXJ7CisgICAgcGFkZGluZy10b3A6IDE1cHg7Cit9CisKKyNsZWZ0LWNvbCB7CisgICAgcGFkZGluZzogMTBweCAyMHB4OworICAgIHBhZGRpbmctbGVmdDogMHB4OworICAgIGJhY2tncm91bmQ6ICNmZmY7CisKK30KKworCisvKmZvb3RlciovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworCisjZm9vdGVyIHsKKyAgICBwYWRkaW5nOiA1cHggMjBweDsKKyAgICBiYWNrZ3JvdW5kOiAjZGRkOworfQorCisjZm9vdGVyLWNvbnRhaW5lcnsKKyAgICBwYWRkaW5nOiA1cHggMjBweDsKKyAgICBiYWNrZ3JvdW5kOiAjMzAzMDMwOworICAgIGJvcmRlci10b3A6IDhweCBzb2xpZCAjMDAwOworICAgIGZvbnQtc2l6ZToxMXB4OworfQorCisjZm9vdGVyLWluZm8geworICAgIGNvbG9yOiNjY2M7CisgICAgdGV4dC1hbGlnbjpsZWZ0OworICAgIGJhY2tncm91bmQ6ICMxYjFiMWI7CisgICAgcGFkZGluZzogMjBweCAwOworfQorCisKKyNmb290ZXItaW5mbyBheworICAgIHRleHQtZGVjb3JhdGlvbjpub25lOworICAgIGNvbG9yOiAjZmZmOworfQorCisjZm9vdGVyLWluZm8gYTpob3ZlcnsKKyAgICBjb2xvcjogI2ViZWJlYjsKK30KKworI2NvcHlyaWdodHtmbG9hdDogbGVmdDt9CisKKy5zY3JvbGwtdG9wIHsKKyAgICB0ZXh0LWFsaWduOnJpZ2h0OworfQorCisjZm9vdGVyLXdpZGdldHsKKyAgICBwYWRkaW5nOiA4cHggMHB4IDhweCAwcHg7CisgICAgY29sb3I6IzZmNmY2ZjsKK30KKworI2Zvb3Rlci13aWRnZXQgI3NlYXJjaCB7CisgICAgd2lkdGg6MTIwcHg7CisgICAgaGVpZ2h0OjI4cHg7CisgICAgYmFja2dyb3VuZDogIzIyMjsKKyAgICBtYXJnaW4tbGVmdDogMHB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjNjY2OworfQorCisjZm9vdGVyLXdpZGdldCAjc2VhcmNoICNzIHsKKyAgICB3aWR0aDoxMTBweDsKKyAgICBoZWlnaHQ6MjNweDsKKyAgICBib3JkZXI6MHB4OworICAgIG1hcmdpbi1sZWZ0OjdweDsKKyAgICBtYXJnaW4tcmlnaHQ6MTBweDsKKyAgICBtYXJnaW4tdG9wOjNweDsKKyAgICBjb2xvcjojZmZmOworICAgIGRpc3BsYXk6IGlubGluZTsKKyAgICBiYWNrZ3JvdW5kOiAjMjIyOworICAgIGZsb2F0OiBsZWZ0OworfQorCisjZm9vdGVyLXdpZGdldCAjY2FsZW5kYXJfd3JhcCB7CisgICAgcGFkZGluZzogOHB4IDBweDsKK30KKworI2Zvb3Rlci13aWRnZXQgI3dwLWNhbGVuZGFyIHRkeworICAgIHBhZGRpbmc6MnB4OworfQorCisKKyNmb290ZXItd2lkZ2V0IC50ZXh0d2lkZ2V0IHsKKyAgICBwYWRkaW5nOiA1cHggMHB4OworICAgIGxpbmUtaGVpZ2h0OiAyM3B4OworfQorCisKKyNmb290ZXItd2lkZ2V0IC53aWRnZXRfdGFnX2Nsb3VkIGF7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIG1hcmdpbjogNXB4OworICAgIGxpbmUtaGVpZ2h0OiAyNHB4OworICAgIG1hcmdpbi1sZWZ0OiAwcHg7CisgICAgY29sb3I6ICM2ZjZmNmY7Cit9CisKKyNmb290ZXItd2lkZ2V0IC53aWRnZXRfdGFnX2Nsb3VkIGE6aG92ZXJ7CisgICAgY29sb3I6ICNmZmY7Cit9CisKKyNmb290ZXItd2lkZ2V0IC53aWRnZXQtY29udGFpbmVyIHVsIGxpIGEgICAgeworICAgIGNvbG9yOiNmZDc4MDA7Cit9CisKKyNmb290ZXItd2lkZ2V0IC53aWRnZXQtY29udGFpbmVyIHVsIGxpIGE6aG92ZXIgICAgeworICAgIGNvbG9yOiAjY2NjOworfQorCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0LWNvbnRhaW5lciBoMyB7CisgICAgY29sb3I6ICNhNWE1YTU7CisgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKKyAgICBtYXJnaW4tYm90dG9tOiAwcHg7CisgICAgcGFkZGluZy10b3A6IDEwcHg7CisgICAgcGFkZGluZy1sZWZ0OiAwcHg7CisgICAgZm9udC1zaXplOiAyNXB4OworICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKKyNmb290ZXItd2lkZ2V0IC53aWRnZXQtY29udGFpbmVyIHVsIGxpIHsKKyAgICBwYWRkaW5nOiA1cHggMHB4OworICAgIGJhY2tncm91bmQ6IG5vbmU7CisgICAgfQorCisjZm9vdGVyLXdpZGdldCB1bCB7CisgICAgbWFyZ2luLWxlZnQ6IDBweDsKKyAgICB9CisKKyNmb290ZXItYmFyMSB7CisgICAgcGFkZGluZy1yaWdodDogNDBweDsKK30KKyNmb290ZXItYmFyMiB7CisgICAgcGFkZGluZy1yaWdodDogNDBweDsKK30KKyNmb290ZXItYmFyMyB7Cit9CisjZm9vdGVyLWJhcjQgeworfQorCitzcGFuI2ZvbGxvdy1ib3h7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIHJpZ2h0OiAxMDBweDsKK30KKworc3BhbiNmb2xsb3ctYm94IGltZ3sKKyAgICBtYXJnaW46IDAgMnB4OworfQorCisvKmxvZ28qLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNsb2dvIHsKKyAgICBtYXJnaW46IDBweCAwcHggMHB4IDBweDsKK30KKworI2xvZ28yIHsKKyAgICBtYXJnaW46IDBweCAwcHggMHB4IDBweDsKK30KKworI2xvZ28gaW1neworICAgIGJvcmRlcjogbm9uZTsKK30KKworI2xvZ28yeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBmb250LXNpemU6IDQycHg7CisgICAgbGV0dGVyLXNwYWNpbmc6IC0xcHQ7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgZm9udC1mYW1pbHk6YXJpYWwsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBsaW5lLWhlaWdodDogNTdweDsKKyAgICBwYWRkaW5nLWxlZnQ6IDBweDsKK30KKworI2xvZ28yIGEsICNzbG9nYW57CisgICAgY29sb3I6ICNmZDc4MDA7Cit9CisKKyNzbG9nYW57CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBwYWRkaW5nLWxlZnQ6IDBweDsKK30KKworLypzZWFyY2gqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNzZWFyY2ggeworICAgIHdpZHRoOjE4MHB4OworICAgIGhlaWdodDoyOHB4OworICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CisgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisjc2lkZWJhciAjc2VhcmNoIHsKKyAgICBtYXJnaW4tdG9wOiAyMHB4OworfQorCisjc2VhcmNoICNzZWFyY2hzdWJtaXQgeworICAgIGJhY2tncm91bmQ6dXJsKGltYWdlcy9nby1idG4ucG5nKSBuby1yZXBlYXQgdG9wIHJpZ2h0OworICAgIHdpZHRoOjI4cHg7CisgICAgaGVpZ2h0OjI4cHg7CisgICAgYm9yZGVyOjBweDsKKyAgICBwb3NpdGlvbjphYnNvbHV0ZTsKKyAgICByaWdodDogLTM1cHg7Cit9CisKKyNzZWFyY2ggI3MgeworICAgIHdpZHRoOjE3MHB4OworICAgIGhlaWdodDoyM3B4OworICAgIGJvcmRlcjowcHg7CisgICAgbWFyZ2luLWxlZnQ6N3B4OworICAgIG1hcmdpbi1yaWdodDoxMHB4OworICAgIG1hcmdpbi10b3A6M3B4OworICAgIGNvbG9yOiMwMDA7CisgICAgZGlzcGxheTogaW5saW5lOworICAgIGZsb2F0OiBsZWZ0OworfQorCisvKm1lbnUgYmFyKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjbWVudV9jb250YWluZXJ7CisgICAgcGFkZGluZy10b3A6IDBweDsKK30KKworCisvKnJlc3BvbnNpdmUgbWVudSovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworLyogZGVmYXVsdCBzdHlsZSAqLworLnNlbGVjdG5hdiB7IGRpc3BsYXk6IG5vbmU7IH0KKworLyogc21hbGwgc2NyZWVuICovCitAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2MDBweCkgeworICAuanMgI25hdiB7IGRpc3BsYXk6IG5vbmU7IH0KKyAgIC5qcyAjbmF2MiB7IGRpc3BsYXk6IG5vbmU7IH0KKyAgLmpzIC5zZWxlY3RuYXYgeyBkaXNwbGF5OiBibG9jazsgfQorfQorCisKKy8qd2VsY29tZSovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKyN3ZWxjb21lX2NvbnRhaW5lciBoMXsKKyAgICBtYXJnaW4tdG9wOiAwcHg7Cit9CisKKy8qaG9tZXBhZ2UgYm94ZXMqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNib3hfY29udGFpbmVyeworICAgIHBhZGRpbmctdG9wOiAzNXB4OworICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OworfQorCisuYm94LWhlYWQgeworICAgIGZsb2F0OiBsZWZ0OworICAgIHBhZGRpbmctYm90dG9tOiAyMHB4OworfQorCisuYm94LWhlYWQgaW1neworCit9CisKKy50aXRsZS1oZWFkeworICAgIHBhZGRpbmctdG9wOjJweDsKK30KKworLnRpdGxlLWJveHsKKyAgICBjb2xvcjogIzMzMzsKKyAgICBsaW5lLWhlaWdodDogMTVweDsKKyAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOworfQorCisudGl0bGUtYm94IGgxIHsKKyAgICBmb250LXNpemU6IDE4cHg7CisgICAgbWFyZ2luLWJvdHRvbTogM3B4OworfQorCisuYm94LWNvbnRlbnQgeworICAgIGZsb2F0OiBsZWZ0OworICAgIHBhZGRpbmctdG9wOiAxMHB4OworICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworfQorCisKKy8qIFBPU1QgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisKKy5wb3N0IHsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworCit9CisKKy5wb3N0LXNoYWRvd3sKKyAgICBiYWNrZ3JvdW5kOiB1cmwoImltYWdlcy9wb3N0X3NoYWRvdy5wbmciKSBuby1yZXBlYXQgYm90dG9tOworICAgIGhlaWdodDogOXB4OworICAgIG1hcmdpbi1ib3R0b206IDI1cHg7Cit9CisKKy5wb3N0IG9seworICAgIG1hcmdpbi1sZWZ0OiAyMHB4OworfQorCisucG9zdCB1bCB7CisgICAgbWFyZ2luLWxlZnQ6IDE1cHg7Cit9CisucG9zdC1lbnRyeSB1bCB7IG1hcmdpbjogMCAwIDEwcHggMTBweDsgfQorLnBvc3QtZW50cnkgdWwgbGkgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG1hcmdpbjogNXB4IDA7CisgICAgcGFkZGluZzogMCAwIDAgMjBweDsKKyAgICAvKmJhY2tncm91bmQ6IHVybChpbWFnZXMvYnVsbGV0LnBuZykgbm8tcmVwZWF0IDAgN3B4OyovCit9CisKKy5wb3N0LWVudHJ5IG9sIHsKKyAgICBsaXN0LXN0eWxlOiBkZWNpbWFsOworICAgIG1hcmdpbjogMCAwIDE4cHggMS42ZW07Cit9CisucG9zdC1lbnRyeSBvbCBsaSB7CisgICAgbGlzdC1zdHlsZTogZGVjaW1hbDsKKyB9CisKKy5wb3N0LWVudHJ5IHsKKyAgICBwYWRkaW5nLWJvdHRvbTogMTBweDsKKyAgICBwYWRkaW5nLXRvcDogMTBweDsKKyAgICBvdmVyZmxvdzogaGlkZGVuOworCit9CisKKy5wb3N0LWhlYWQgeworICAgIG1hcmdpbi1ib3R0b206IDVweDsKKyAgICBwYWRkaW5nLXRvcDogMTVweDsKK30KKworLnBvc3QtaGVhZCBoMSBhLCAucG9zdC1oZWFkIGgxIHsKKyAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKKyAgICBjb2xvcjojMDAwOworICAgIG1hcmdpbjogMHB4OworICAgIGZvbnQtc2l6ZTogMjdweDsKK30KKworLnBvc3QtaGVhZCBoMSBhOmhvdmVyIHsKKyAgICBjb2xvcjojNzc3OworfQorCisKKy5wb3N0LWhlYWQtbm90Zm91bmQgaDEsIC5wb3N0LWhlYWQtNDA0IGgxLCAucG9zdC1oZWFkLWFyY2hpdmUgaDEsIC5wb3N0LWhlYWQtc2VhcmNoIGgxIHsKKyAgICBtYXJnaW4tYm90dG9tOiAxMHB4OworICAgIGZvbnQtd2VpZ2h0Om5vcm1hbDsKKyAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKKyAgICBjb2xvcjojMDAwOworICAgIGZvbnQtc2l6ZTogMjdweDsKK30KKworLnBvc3QtdGh1bWIgaW1nIHsKKyAgICBib3JkZXI6IDBweCBzb2xpZCAjZWJlYmViOworfQorCisucG9zdC1lbnRyeSBpbWd7CisgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgICBoZWlnaHQ6YXV0bzsKKyAgICBtYXgtd2lkdGg6MTAwJSAhaW1wb3J0YW50OworfQorCisubWV0YS1kYXRheworICAgIGxpbmUtaGVpZ2h0OiAxNnB4OworICAgIHBhZGRpbmc6IDZweCAzcHg7CisgICAgbWFyZ2luLWJvdHRvbTogM3B4OworICAgIGZvbnQtc2l6ZTogMTFweDsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U5ZTllOTsKK30KKworLm1ldGEtZGF0YSBheworICAgIGNvbG9yOiAjZmQ3ODAwOworfQorCisubWV0YS1kYXRhIGE6aG92ZXJ7CisgICAgY29sb3I6ICM3Nzc7Cit9CisKKy5yZWFkLW1vcmUgeworY29sb3I6ICMwMDA7CisgICAgYmFja2dyb3VuZDogI2ZmZjsKKyAgICAgIHBhZGRpbmc6IDRweCA4cHg7CisgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICBmb250LXNpemU6IDExcHg7CisgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOworICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgbWFyZ2luLXRvcDogMjBweDsKK30KKworLnJlYWQtbW9yZTpob3ZlcnsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworICAgIGNvbG9yOiAjNjY2OworfQorCisuY2xlYXIgeworICAgIGNsZWFyOmJvdGg7Cit9CisKKy5zdGlja3kgeworCit9CisKKy8qIGNvbnRlbnQgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworI2NvbnRlbnRfY29udGFpbmVyIHRhYmxlIHsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjZTdlN2U3OworICAgIG1hcmdpbjogMCAtMXB4IDI0cHggMDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgIHdpZHRoOiAxMDAlOworCit9CisjY29udGVudF9jb250YWluZXIgdHIgdGgsCisjY29udGVudF9jb250YWluZXIgdGhlYWQgdGggeworICAgIGNvbG9yOiAjODg4OworICAgIGZvbnQtc2l6ZTogMTJweDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBsaW5lLWhlaWdodDogMThweDsKKyAgICBwYWRkaW5nOiA5cHggMTBweDsKK30KKyNjb250ZW50X2NvbnRhaW5lciB0ciB0ZCB7CisKKyAgICBwYWRkaW5nOiA2cHggMTBweDsKK30KKyNjb250ZW50X2NvbnRhaW5lciB0ci5vZGQgdGQgeworICAgIGJhY2tncm91bmQ6ICNmMmY3ZmM7Cit9CisKKy8qLS1uYXZpZ2F0aW9uLS0qLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKy5uYXZpZ2F0aW9uIHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICB3aWR0aDogMTAwJTsKKyAgICBtYXJnaW46IDIwcHggMDsKK30KKworCisubmF2aWdhdGlvbiAuYWxpZ25sZWZ0IGEgeworICAgIGZsb2F0OiBsZWZ0OworfQorCisubmF2aWdhdGlvbiAuYWxpZ25yaWdodCBhIHsKKyAgICBmbG9hdDogcmlnaHQ7Cit9CisKKyNuYXYtc2luZ2xlIHsKKyAgICBvdmVyZmxvdzpoaWRkZW47CisgICAgbWFyZ2luLXRvcDoyMHB4OworICAgIG1hcmdpbi1ib3R0b206MTBweDsKK30KKy5uYXYtcHJldmlvdXMgeworICAgIGZsb2F0OiBsZWZ0OworICAgIHdpZHRoOiA1MCU7Cit9CisubmF2LW5leHQgeworICAgIGZsb2F0OiByaWdodDsKKyAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICB3aWR0aDogNTAlOworfQorCisvKi0tc3ViIGhlYWQgYW5kIGJyZWFkY3J1bWJzLS0qLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNzdWJoZWFkX2NvbnRhaW5lcnsKKyAgICBwYWRkaW5nOiA3cHggMHB4OworfQorCisjc3ViaGVhZCBoMXsKKyAgICBjb2xvcjogIzAwMDsKKyAgICBwYWRkaW5nLXRvcDogMTBweDsKKyAgICBwYWRkaW5nLWxlZnQ6IDBweDsKKyAgICBmb250LXNpemU6IDMwcHg7Cit9CisKKyNicmVhZGNydW1icyB7CisgICAgcGFkZGluZy1sZWZ0OiAyNXB4OworICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CisgICAgY29sb3I6ICM5ZTllOWU7CisgICAgbWFyZ2luOjAgYXV0bzsKKyAgICB3aWR0aDogOTY0cHg7CisgICAgZm9udC1zaXplOiAxMHB4OworfQorCisjYnJlYWRjcnVtYnMgYXsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgY29sb3I6ICM5ZTllOWU7Cit9CisKKy8qQWxpZ25tZW50cyAqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKy5hbGlnbmxlZnQsCitpbWcuYWxpZ25sZWZ0IHsKKyAgICBkaXNwbGF5OiBpbmxpbmU7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgbWFyZ2luLXJpZ2h0OiAyMnB4OworICAgIG1hcmdpbi10b3A6IDlweDsKK30KKworLmFsaWducmlnaHQsCitpbWcuYWxpZ25yaWdodCB7CisgICAgZGlzcGxheTogaW5saW5lOworICAgIGZsb2F0OiByaWdodDsKKyAgICBtYXJnaW4tbGVmdDogMjJweDsKKyAgICBtYXJnaW4tdG9wOiA4cHg7Cit9CisuYWxpZ25jZW50ZXIsCitpbWcuYWxpZ25jZW50ZXIgeworICAgIGNsZWFyOiBib3RoOworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi1yaWdodDogYXV0bzsKK30KKworLmFsaWdubGVmdCwKKy5hbGlnbnJpZ2h0LAorLmFsaWduY2VudGVyLAoraW1nLmFsaWdubGVmdCwKK2ltZy5hbGlnbnJpZ2h0LAoraW1nLmFsaWduY2VudGVyCit7CisgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKK30KKworCithIGltZy5hbGlnbmNlbnRlciB7CisgICAgZGlzcGxheTpibG9jazsKKyAgICBtYXJnaW4tbGVmdDphdXRvOworICAgIG1hcmdpbi1yaWdodDphdXRvOworfQorCitpbWcgeyAtd2Via2l0LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OyBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgfQpkaWZmIC0tZ2l0IGEvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9uYW1lZF9kYXRhX3N0eWxlLmNzc190IGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9uYW1lZF9kYXRhX3N0eWxlLmNzc190Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZGZiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL25hbWVkX2RhdGFfdGhlbWUvc3RhdGljL25hbWVkX2RhdGFfc3R5bGUuY3NzX3QKQEAgLTAsMCArMSw4MTMgQEAKK0BpbXBvcnQgdXJsKCJiYXNlLmNzcyIpOworCitAaW1wb3J0IHVybCgiZm91bmRhdGlvbi5jc3MiKTsKKwordGFibGUgeworICAgICAgYm9yZGVyOiAwOworfQorCitwcmUgeworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTsKKyAgICBjb2xvcjogIzIyMjsKKyAgICAvKiBsaW5lLWhlaWdodDogMS4wZW07ICovCisgICAgYm9yZGVyOiAycHggc29saWQgI0M2QzlDQjsKKyAgICBmb250LXNpemU6IDAuOWVtOworICAgIC8qIG1hcmdpbjogMS41ZW0gMCAxLjVlbSAwOyAqLworICAgIG1hcmdpbjogMDsKKyAgICBib3JkZXItcmlnaHQtc3R5bGU6IG5vbmU7CisgICAgYm9yZGVyLWxlZnQtc3R5bGU6IG5vbmU7Cit9CisKKy8qIEdlbmVyYWwgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCithOmxpbmsgeworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KK2E6dmlzaXRlZCB7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorYTphY3RpdmUsCithOmhvdmVyIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CisKK2gxLGgyLGgzLGg0LGg1LGg2IHsKKyAgICBjb2xvcjogIzAwMDsKKyAgICBtYXJnaW4tYm90dG9tOiAxOHB4OworfQorCitoMSB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDI0cHg7IH0KK2gyIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMThweDsgfQoraDMgeyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAxNnB4OyB9CitoNCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDE0cHg7IH0KKworaHIgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNjNmM2YzY7CisgICAgYm9yZGVyOjA7CisgICAgaGVpZ2h0OiAxcHg7CisgICAgbWFyZ2luLWJvdHRvbTogMThweDsKKyAgICBjbGVhcjpib3RoOworfQorCitkaXYuaHIgeworICBoZWlnaHQ6IDFweDsKKyAgYmFja2dyb3VuZDogI2M2YzZjNjsKK30KKworZGl2LmhyMiB7CisgIGhlaWdodDogMXB4OworICBiYWNrZ3JvdW5kOiAjYzZjNmM2OworfQorCitkaXYuaHIgaHIsIGRpdi5ocjIgaHIgeworICBkaXNwbGF5OiBub25lOworfQorCitwIHsKKyAgICBwYWRkaW5nOiAwOworICAgIGxpbmUtaGVpZ2h0OjEuNmVtOworfQordWwgeworICAgIGxpc3Qtc3R5bGU6IHNxdWFyZTsKKyAgICBtYXJnaW46IDAgMCAxOHB4IDA7Cit9CitvbCB7CisgICAgbGlzdC1zdHlsZTogZGVjaW1hbDsKKyAgICBtYXJnaW46IDAgMCAxOHB4IDEuNWVtOworfQorb2wgb2wgeworICAgIGxpc3Qtc3R5bGU6dXBwZXItYWxwaGE7Cit9CitvbCBvbCBvbCB7CisgICAgbGlzdC1zdHlsZTpsb3dlci1yb21hbjsKK30KK29sIG9sIG9sIG9sIHsKKyAgICBsaXN0LXN0eWxlOmxvd2VyLWFscGhhOworfQordWwgdWwsCitvbCBvbCwKK3VsIG9sLAorb2wgdWwgeworICAgIG1hcmdpbi1ib3R0b206MDsKK30KK2RsIHsKKyAgICBtYXJnaW46MCAwIDI0cHggMDsKK30KK2R0IHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KK2RkIHsKKyAgICBtYXJnaW4tYm90dG9tOiAxOHB4OworfQorc3Ryb25nIHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBjb2xvcjogIzAwMDsKK30KK2NpdGUsCitlbSwKK2kgeworICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKKyAgICBib3JkZXI6IG5vbmU7Cit9CitiaWcgeworICAgIGZvbnQtc2l6ZTogMTMxLjI1JTsKK30KK2lucyB7CisgICAgYmFja2dyb3VuZDogI0ZGRkZDQzsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgY29sb3I6ICMzMzM7Cit9CitkZWwgeworICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOworICAgIGNvbG9yOiAjNTU1OworfQorYmxvY2txdW90ZSB7CisgICAgcGFkZGluZzogMCAzZW07Cit9CitibG9ja3F1b3RlIGNpdGUsCitibG9ja3F1b3RlIGVtLAorYmxvY2txdW90ZSBpIHsKKyAgICBmb250LXN0eWxlOiBub3JtYWw7Cit9CitwcmUgeworICAgIGJhY2tncm91bmQ6ICNmN2Y3Zjc7CisgICAgY29sb3I6ICMyMjI7CisgICAgcGFkZGluZzogMS41ZW07Cit9CithYmJyLAorYWNyb255bSB7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2NjY7CisgICAgY3Vyc29yOiBoZWxwOworfQoraW5zIHsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cit9CitzdXAsCitzdWIgeworICAgIGhlaWdodDogMDsKKyAgICBsaW5lLWhlaWdodDogMTsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworICAgIGZvbnQtc2l6ZTogMTBweDsKK30KK3N1cCB7CisgICAgYm90dG9tOiAxZXg7Cit9CitzdWIgeworICAgIHRvcDogLjVleDsKK30KKworcCwKK3VsLAorb2wsCitkZCwKK2hyIHsKKyAgICBtYXJnaW4tYm90dG9tOjEwcHg7Cit9Cit1bCB1bCwKK29sIG9sLAordWwgb2wsCitvbCB1bCB7CisgICAgbWFyZ2luLWJvdHRvbTowOworfQorcHJlLAora2JkLAordHQsCit2YXIgeworfQorY29kZSB7CisgICAgZm9udC1zaXplOiAxM3B4OworfQorc3Ryb25nLAorYiwKK2R0LAordGggeworICAgIGNvbG9yOiAjMDAwOworfQorCisKKy8qIG1haW5fY29udGFpbmVyICovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworI3dyYXBwZXIgeworICAgIHBhZGRpbmc6IDBweCAwcHg7CisgICAgbWFyZ2luLXRvcDogMjBweDsKK30KKworLyogaGVhZGVyKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjc2VhcmNoLWhlYWRlcnsKKyAgICBtYXJnaW4tdG9wOjE1cHg7CisgICAgcGFkZGluZy1ib3R0b206MTNweDsKK30KKworI3NlYXJjaC1oZWFkZXIgI3NlYXJjaHsKKyAgICBiYWNrZ3JvdW5kOiAjMjIyOworCit9CisKKyNzZWFyY2gtaGVhZGVyICNzZWFyY2ggI3N7CisgICAgYmFja2dyb3VuZDogIzIyMjsKKyAgICBmb250LXNpemU6MTJweDsKKyAgICBjb2xvcjogI2FhYTsKK30KKworI2hlYWRlcl9jb250YWluZXJ7CisgICAgcGFkZGluZy1ib3R0b206IDI1cHg7CisgICAgcGFkZGluZy10b3A6IDBweDsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworfQorCisjaGVhZGVyIHsKKworfQorCisjaGVhZGVyMiB7CisKK30KKworI2NvbnRlbnRfY29udGFpbmVyeworICAgIHBhZGRpbmctdG9wOiAxNXB4OworfQorCisjbGVmdC1jb2wgeworICAgIHBhZGRpbmc6IDEwcHggMjBweDsKKyAgICBwYWRkaW5nLWxlZnQ6IDBweDsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworCit9CisKKworLypmb290ZXIqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKworI2Zvb3RlciB7CisgICAgcGFkZGluZzogNXB4IDIwcHg7CisgICAgYmFja2dyb3VuZDogI2RkZDsKK30KKworI2Zvb3Rlci1jb250YWluZXJ7CisgICAgcGFkZGluZzogNXB4IDIwcHg7CisgICAgYmFja2dyb3VuZDogIzMwMzAzMDsKKyAgICBib3JkZXItdG9wOiA4cHggc29saWQgIzAwMDsKKyAgICBmb250LXNpemU6MTFweDsKK30KKworI2Zvb3Rlci1pbmZvIHsKKyAgICBjb2xvcjojY2NjOworICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICBiYWNrZ3JvdW5kOiAjMWIxYjFiOworICAgIHBhZGRpbmc6IDIwcHggMDsKK30KKworCisjZm9vdGVyLWluZm8gYXsKKyAgICB0ZXh0LWRlY29yYXRpb246bm9uZTsKKyAgICBjb2xvcjogI2ZmZjsKK30KKworI2Zvb3Rlci1pbmZvIGE6aG92ZXJ7CisgICAgY29sb3I6ICNlYmViZWI7Cit9CisKKyNjb3B5cmlnaHR7ZmxvYXQ6IGxlZnQ7fQorCisuc2Nyb2xsLXRvcCB7CisgICAgdGV4dC1hbGlnbjpyaWdodDsKK30KKworI2Zvb3Rlci13aWRnZXR7CisgICAgcGFkZGluZzogOHB4IDBweCA4cHggMHB4OworICAgIGNvbG9yOiM2ZjZmNmY7Cit9CisKKyNmb290ZXItd2lkZ2V0ICNzZWFyY2ggeworICAgIHdpZHRoOjEyMHB4OworICAgIGhlaWdodDoyOHB4OworICAgIGJhY2tncm91bmQ6ICMyMjI7CisgICAgbWFyZ2luLWxlZnQ6IDBweDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgYm9yZGVyOiAxcHggc29saWQgIzY2NjsKK30KKworI2Zvb3Rlci13aWRnZXQgI3NlYXJjaCAjcyB7CisgICAgd2lkdGg6MTEwcHg7CisgICAgaGVpZ2h0OjIzcHg7CisgICAgYm9yZGVyOjBweDsKKyAgICBtYXJnaW4tbGVmdDo3cHg7CisgICAgbWFyZ2luLXJpZ2h0OjEwcHg7CisgICAgbWFyZ2luLXRvcDozcHg7CisgICAgY29sb3I6I2ZmZjsKKyAgICBkaXNwbGF5OiBpbmxpbmU7CisgICAgYmFja2dyb3VuZDogIzIyMjsKKyAgICBmbG9hdDogbGVmdDsKK30KKworI2Zvb3Rlci13aWRnZXQgI2NhbGVuZGFyX3dyYXAgeworICAgIHBhZGRpbmc6IDhweCAwcHg7Cit9CisKKyNmb290ZXItd2lkZ2V0ICN3cC1jYWxlbmRhciB0ZHsKKyAgICBwYWRkaW5nOjJweDsKK30KKworCisjZm9vdGVyLXdpZGdldCAudGV4dHdpZGdldCB7CisgICAgcGFkZGluZzogNXB4IDBweDsKKyAgICBsaW5lLWhlaWdodDogMjNweDsKK30KKworCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0X3RhZ19jbG91ZCBheworICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICBtYXJnaW46IDVweDsKKyAgICBsaW5lLWhlaWdodDogMjRweDsKKyAgICBtYXJnaW4tbGVmdDogMHB4OworICAgIGNvbG9yOiAjNmY2ZjZmOworfQorCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0X3RhZ19jbG91ZCBhOmhvdmVyeworICAgIGNvbG9yOiAjZmZmOworfQorCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0LWNvbnRhaW5lciB1bCBsaSBhICAgIHsKKyAgICBjb2xvcjojZmQ3ODAwOworfQorCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0LWNvbnRhaW5lciB1bCBsaSBhOmhvdmVyICAgIHsKKyAgICBjb2xvcjogI2NjYzsKK30KKworI2Zvb3Rlci13aWRnZXQgLndpZGdldC1jb250YWluZXIgaDMgeworICAgIGNvbG9yOiAjYTVhNWE1OworICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CisgICAgbWFyZ2luLWJvdHRvbTogMHB4OworICAgIHBhZGRpbmctdG9wOiAxMHB4OworICAgIHBhZGRpbmctbGVmdDogMHB4OworICAgIGZvbnQtc2l6ZTogMjVweDsKKyAgICBwYWRkaW5nLWJvdHRvbTogOHB4OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorCisjZm9vdGVyLXdpZGdldCAud2lkZ2V0LWNvbnRhaW5lciB1bCBsaSB7CisgICAgcGFkZGluZzogNXB4IDBweDsKKyAgICBiYWNrZ3JvdW5kOiBub25lOworICAgIH0KKworI2Zvb3Rlci13aWRnZXQgdWwgeworICAgIG1hcmdpbi1sZWZ0OiAwcHg7CisgICAgfQorCisjZm9vdGVyLWJhcjEgeworICAgIHBhZGRpbmctcmlnaHQ6IDQwcHg7Cit9CisjZm9vdGVyLWJhcjIgeworICAgIHBhZGRpbmctcmlnaHQ6IDQwcHg7Cit9CisjZm9vdGVyLWJhcjMgeworfQorI2Zvb3Rlci1iYXI0IHsKK30KKworc3BhbiNmb2xsb3ctYm94eworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICByaWdodDogMTAwcHg7Cit9CisKK3NwYW4jZm9sbG93LWJveCBpbWd7CisgICAgbWFyZ2luOiAwIDJweDsKK30KKworLypsb2dvKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjbG9nbyB7CisgICAgbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Cit9CisKKyNsb2dvMiB7CisgICAgbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Cit9CisKKyNsb2dvIGltZ3sKKyAgICBib3JkZXI6IG5vbmU7Cit9CisKKyNsb2dvMnsKKyAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgZm9udC1zaXplOiA0MnB4OworICAgIGxldHRlci1zcGFjaW5nOiAtMXB0OworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIGZvbnQtZmFtaWx5OmFyaWFsLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgbGluZS1oZWlnaHQ6IDU3cHg7CisgICAgcGFkZGluZy1sZWZ0OiAwcHg7Cit9CisKKyNsb2dvMiBhLCAjc2xvZ2FueworICAgIGNvbG9yOiAjZmQ3ODAwOworfQorCisjc2xvZ2FueworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgcGFkZGluZy1sZWZ0OiAwcHg7Cit9CisKKy8qc2VhcmNoKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjc2VhcmNoIHsKKyAgICB3aWR0aDoxODBweDsKKyAgICBoZWlnaHQ6MjhweDsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOworICAgIG1hcmdpbi1sZWZ0OiAxMHB4OworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworI3NpZGViYXIgI3NlYXJjaCB7CisgICAgbWFyZ2luLXRvcDogMjBweDsKK30KKworI3NlYXJjaCAjc2VhcmNoc3VibWl0IHsKKyAgICBiYWNrZ3JvdW5kOnVybChpbWFnZXMvZ28tYnRuLnBuZykgbm8tcmVwZWF0IHRvcCByaWdodDsKKyAgICB3aWR0aDoyOHB4OworICAgIGhlaWdodDoyOHB4OworICAgIGJvcmRlcjowcHg7CisgICAgcG9zaXRpb246YWJzb2x1dGU7CisgICAgcmlnaHQ6IC0zNXB4OworfQorCisjc2VhcmNoICNzIHsKKyAgICB3aWR0aDoxNzBweDsKKyAgICBoZWlnaHQ6MjNweDsKKyAgICBib3JkZXI6MHB4OworICAgIG1hcmdpbi1sZWZ0OjdweDsKKyAgICBtYXJnaW4tcmlnaHQ6MTBweDsKKyAgICBtYXJnaW4tdG9wOjNweDsKKyAgICBjb2xvcjojMDAwOworICAgIGRpc3BsYXk6IGlubGluZTsKKyAgICBmbG9hdDogbGVmdDsKK30KKworLyptZW51IGJhciovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworI21lbnVfY29udGFpbmVyeworICAgIHBhZGRpbmctdG9wOiAwcHg7Cit9CisKKworLypyZXNwb25zaXZlIG1lbnUqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKy8qIGRlZmF1bHQgc3R5bGUgKi8KKy5zZWxlY3RuYXYgeyBkaXNwbGF5OiBub25lOyB9CisKKy8qIHNtYWxsIHNjcmVlbiAqLworQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjAwcHgpIHsKKyAgLmpzICNuYXYgeyBkaXNwbGF5OiBub25lOyB9CisgICAuanMgI25hdjIgeyBkaXNwbGF5OiBub25lOyB9CisgIC5qcyAuc2VsZWN0bmF2IHsgZGlzcGxheTogYmxvY2s7IH0KK30KKworCisvKndlbGNvbWUqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisjd2VsY29tZV9jb250YWluZXIgaDF7CisgICAgbWFyZ2luLXRvcDogMHB4OworfQorCisvKmhvbWVwYWdlIGJveGVzKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjYm94X2NvbnRhaW5lcnsKKyAgICBwYWRkaW5nLXRvcDogMzVweDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMTVweDsKK30KKworLmJveC1oZWFkIHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBwYWRkaW5nLWJvdHRvbTogMjBweDsKK30KKworLmJveC1oZWFkIGltZ3sKKworfQorCisudGl0bGUtaGVhZHsKKyAgICBwYWRkaW5nLXRvcDoycHg7Cit9CisKKy50aXRsZS1ib3h7CisgICAgY29sb3I6ICMzMzM7CisgICAgbGluZS1oZWlnaHQ6IDE1cHg7CisgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKK30KKworLnRpdGxlLWJveCBoMSB7CisgICAgZm9udC1zaXplOiAxOHB4OworICAgIG1hcmdpbi1ib3R0b206IDNweDsKK30KKworLmJveC1jb250ZW50IHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICBwYWRkaW5nLXRvcDogMTBweDsKKyAgICBsaW5lLWhlaWdodDogMjBweDsKK30KKworCisvKiBQT1NUICovCisvKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8KKworCisucG9zdCB7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKworfQorCisucG9zdC1zaGFkb3d7CisgICAgYmFja2dyb3VuZDogdXJsKCJpbWFnZXMvcG9zdF9zaGFkb3cucG5nIikgbm8tcmVwZWF0IGJvdHRvbTsKKyAgICBoZWlnaHQ6IDlweDsKKyAgICBtYXJnaW4tYm90dG9tOiAyNXB4OworfQorCisucG9zdCBvbHsKKyAgICBtYXJnaW4tbGVmdDogMjBweDsKK30KKworLnBvc3QgdWwgeworICAgIG1hcmdpbi1sZWZ0OiAxNXB4OworfQorLnBvc3QtZW50cnkgdWwgeyBtYXJnaW46IDAgMCAxMHB4IDEwcHg7IH0KKy5wb3N0LWVudHJ5IHVsIGxpIHsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW46IDVweCAwOworICAgIHBhZGRpbmc6IDAgMCAwIDIwcHg7CisgICAgLypiYWNrZ3JvdW5kOiB1cmwoaW1hZ2VzL2J1bGxldC5wbmcpIG5vLXJlcGVhdCAwIDdweDsqLworfQorCisucG9zdC1lbnRyeSBvbCB7CisgICAgbGlzdC1zdHlsZTogZGVjaW1hbDsKKyAgICBtYXJnaW46IDAgMCAxOHB4IDEuNmVtOworfQorLnBvc3QtZW50cnkgb2wgbGkgeworICAgIGxpc3Qtc3R5bGU6IGRlY2ltYWw7CisgfQorCisucG9zdC1lbnRyeSB7CisgICAgcGFkZGluZy1ib3R0b206IDEwcHg7CisgICAgcGFkZGluZy10b3A6IDEwcHg7CisgICAgb3ZlcmZsb3c6IGhpZGRlbjsKKworfQorCisucG9zdC1oZWFkIHsKKyAgICBtYXJnaW4tYm90dG9tOiA1cHg7CisgICAgcGFkZGluZy10b3A6IDE1cHg7Cit9CisKKy5wb3N0LWhlYWQgaDEgYSwgLnBvc3QtaGVhZCBoMSB7CisgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CisgICAgY29sb3I6IzAwMDsKKyAgICBtYXJnaW46IDBweDsKKyAgICBmb250LXNpemU6IDI3cHg7Cit9CisKKy5wb3N0LWhlYWQgaDEgYTpob3ZlciB7CisgICAgY29sb3I6Izc3NzsKK30KKworCisucG9zdC1oZWFkLW5vdGZvdW5kIGgxLCAucG9zdC1oZWFkLTQwNCBoMSwgLnBvc3QtaGVhZC1hcmNoaXZlIGgxLCAucG9zdC1oZWFkLXNlYXJjaCBoMSB7CisgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKKyAgICBmb250LXdlaWdodDpub3JtYWw7CisgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7CisgICAgY29sb3I6IzAwMDsKKyAgICBmb250LXNpemU6IDI3cHg7Cit9CisKKy5wb3N0LXRodW1iIGltZyB7CisgICAgYm9yZGVyOiAwcHggc29saWQgI2ViZWJlYjsKK30KKworLnBvc3QtZW50cnkgaW1neworICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgICAgaGVpZ2h0OmF1dG87CisgICAgICBtYXgtd2lkdGg6MTAwJSAhaW1wb3J0YW50OworfQorCisubWV0YS1kYXRheworICAgIGxpbmUtaGVpZ2h0OiAxNnB4OworICAgIHBhZGRpbmc6IDZweCAzcHg7CisgICAgbWFyZ2luLWJvdHRvbTogM3B4OworICAgIGZvbnQtc2l6ZTogMTFweDsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U5ZTllOTsKK30KKworLm1ldGEtZGF0YSBheworICAgIGNvbG9yOiAjZmQ3ODAwOworfQorCisubWV0YS1kYXRhIGE6aG92ZXJ7CisgICAgY29sb3I6ICM3Nzc7Cit9CisKKy5yZWFkLW1vcmUgeworY29sb3I6ICMwMDA7CisgICAgYmFja2dyb3VuZDogI2ZmZjsKKyAgICAgIHBhZGRpbmc6IDRweCA4cHg7CisgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CisgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICBmb250LXNpemU6IDExcHg7CisgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOworICAgICAgY3Vyc29yOiBwb2ludGVyOworICAgICAgbWFyZ2luLXRvcDogMjBweDsKK30KKworLnJlYWQtbW9yZTpob3ZlcnsKKyAgICBiYWNrZ3JvdW5kOiAjZmZmOworICAgIGNvbG9yOiAjNjY2OworfQorCisuY2xlYXIgeworICAgIGNsZWFyOmJvdGg7Cit9CisKKy5zdGlja3kgeworCit9CisKKy8qIGNvbnRlbnQgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworI2NvbnRlbnRfY29udGFpbmVyIHRhYmxlIHsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAjZTdlN2U3OworICAgIG1hcmdpbjogMCAtMXB4IDI0cHggMDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgIHdpZHRoOiAxMDAlOworCit9CisjY29udGVudF9jb250YWluZXIgdHIgdGgsCisjY29udGVudF9jb250YWluZXIgdGhlYWQgdGggeworICAgIGNvbG9yOiAjODg4OworICAgIGZvbnQtc2l6ZTogMTJweDsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBsaW5lLWhlaWdodDogMThweDsKKyAgICBwYWRkaW5nOiA5cHggMTBweDsKK30KKyNjb250ZW50X2NvbnRhaW5lciB0ciB0ZCB7CisKKyAgICBwYWRkaW5nOiA2cHggMTBweDsKK30KKyNjb250ZW50X2NvbnRhaW5lciB0ci5vZGQgdGQgeworICAgIGJhY2tncm91bmQ6ICNmMmY3ZmM7Cit9CisKKy8qIHNpZGViYXIqLworLyovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovCisKKyNzaWRlYmFyIHsKKyAgICBwYWRkaW5nOjBweCAyMHB4IDIwcHggMHB4OworfQorCisjc2lkZWJhciB1bCAgeworICAgIGxpc3Qtc3R5bGU6IG5vbmU7Cit9CisKKyNzaWRlYmFyIHsgd29yZC13cmFwOiBicmVhay13b3JkO30KKworCisvKi0tbmF2aWdhdGlvbi0tKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisubmF2aWdhdGlvbiB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgd2lkdGg6IDEwMCU7CisgICAgbWFyZ2luOiAyMHB4IDA7Cit9CisKKworLm5hdmlnYXRpb24gLmFsaWdubGVmdCBhIHsKKyAgICBmbG9hdDogbGVmdDsKK30KKworLm5hdmlnYXRpb24gLmFsaWducmlnaHQgYSB7CisgICAgZmxvYXQ6IHJpZ2h0OworfQorCisjbmF2LXNpbmdsZSB7CisgICAgb3ZlcmZsb3c6aGlkZGVuOworICAgIG1hcmdpbi10b3A6MjBweDsKKyAgICBtYXJnaW4tYm90dG9tOjEwcHg7Cit9CisubmF2LXByZXZpb3VzIHsKKyAgICBmbG9hdDogbGVmdDsKKyAgICB3aWR0aDogNTAlOworfQorLm5hdi1uZXh0IHsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgd2lkdGg6IDUwJTsKK30KKworLyotLXNsaWRlci0tKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjc2xpZGVyX2NvbnRhaW5lciB7CisgICAgYmFja2dyb3VuZDogI2ZmZjsKK30KKworLmZsZXgtY2FwdGlvbnsKK2JhY2tncm91bmQ6ICMyMzIzMjM7Citjb2xvcjogI2ZmZjsKK3BhZGRpbmc6IDdweDsKK30KKworLmZsZXhzbGlkZXIgcHsKKyAgICBtYXJnaW46IDBweDsKK30KKworLyotLXN1YiBoZWFkIGFuZCBicmVhZGNydW1icy0tKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisjc3ViaGVhZF9jb250YWluZXJ7CisgICAgcGFkZGluZzogN3B4IDBweDsKK30KKworI3N1YmhlYWQgaDF7CisgICAgY29sb3I6ICMwMDA7CisgICAgcGFkZGluZy10b3A6IDEwcHg7CisgICAgcGFkZGluZy1sZWZ0OiAwcHg7CisgICAgZm9udC1zaXplOiAzMHB4OworfQorCisjYnJlYWRjcnVtYnMgeworICAgIHBhZGRpbmctbGVmdDogMjVweDsKKyAgICBtYXJnaW4tYm90dG9tOiAxNXB4OworICAgIGNvbG9yOiAjOWU5ZTllOworICAgIG1hcmdpbjowIGF1dG87CisgICAgd2lkdGg6IDk2NHB4OworICAgIGZvbnQtc2l6ZTogMTBweDsKK30KKworI2JyZWFkY3J1bWJzIGF7CisgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgIGNvbG9yOiAjOWU5ZTllOworfQorCisvKkFsaWdubWVudHMgKi8KKy8qLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLworCisuYWxpZ25sZWZ0LAoraW1nLmFsaWdubGVmdCB7CisgICAgZGlzcGxheTogaW5saW5lOworICAgIGZsb2F0OiBsZWZ0OworICAgIG1hcmdpbi1yaWdodDogMjJweDsKKyAgICBtYXJnaW4tdG9wOiA5cHg7Cit9CisKKy5hbGlnbnJpZ2h0LAoraW1nLmFsaWducmlnaHQgeworICAgIGRpc3BsYXk6IGlubGluZTsKKyAgICBmbG9hdDogcmlnaHQ7CisgICAgbWFyZ2luLWxlZnQ6IDIycHg7CisgICAgbWFyZ2luLXRvcDogOHB4OworfQorLmFsaWduY2VudGVyLAoraW1nLmFsaWduY2VudGVyIHsKKyAgICBjbGVhcjogYm90aDsKKyAgICBkaXNwbGF5OiBibG9jazsKKyAgICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgICBtYXJnaW4tcmlnaHQ6IGF1dG87Cit9CisKKy5hbGlnbmxlZnQsCisuYWxpZ25yaWdodCwKKy5hbGlnbmNlbnRlciwKK2ltZy5hbGlnbmxlZnQsCitpbWcuYWxpZ25yaWdodCwKK2ltZy5hbGlnbmNlbnRlcgoreworICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cit9CisKKworYSBpbWcuYWxpZ25jZW50ZXIgeworICAgIGRpc3BsYXk6YmxvY2s7CisgICAgbWFyZ2luLWxlZnQ6YXV0bzsKKyAgICBtYXJnaW4tcmlnaHQ6YXV0bzsKK30KKworCit0YWJsZSB7CisgICAgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOworfQordGFibGUsIHRoLCB0ZCB7CisgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CisgICAgcGFkZGluZzogNXB4OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvbmF2X2YucG5nIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy9uYXZfZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5YWMyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvbmF2X2YucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvdGFiX2IucG5nIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3N0YXRpYy90YWJfYi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxZmI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9zdGF0aWMvdGFiX2IucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvbmFtZWRfZGF0YV90aGVtZS90aGVtZS5jb25mIGIvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL3RoZW1lLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1YTdmZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbmFtZWRfZGF0YV90aGVtZS90aGVtZS5jb25mCkBAIC0wLDAgKzEsMTUgQEAKK1t0aGVtZV0KK2luaGVyaXQgPSBhZ29nbworc3R5bGVzaGVldCA9IG5hbWVkX2RhdGFfc3R5bGUuY3NzCisjIHB5Z21lbnRzX3N0eWxlID0gc3BoaW54CisKK3RoZW1lX2JvZHlmb250ID0gIm5vcm1hbCAxMnB4IFZlcmRhbmEsIHNhbnMtc2VyaWYiCit0aGVtZV9iZ2NvbG9yID0gIiNjY2MiCisKK3RoZW1lX2RvY3VtZW50d2lkdGggPSAiMTAwJSIKK3RoZW1lX3RleHRhbGlnbiA9ICJsZWZ0IgorCitbb3B0aW9uc10KKworc3RpY2t5c2lkZWJhciA9IHRydWUKK2NvbGxhcHNpYmxlc2lkZWJhciA9IHRydWUKZGlmZiAtLWdpdCBhL3NyYy9jb25zdW1lci5jcHAgYi9zcmMvY29uc3VtZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NWFjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29uc3VtZXIuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFBTeW5jLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgUFN5bmMgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIFBTeW5jIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFBTeW5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIFBTeW5jLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJjb25zdW1lci5ocHAiCisjaW5jbHVkZSAiZGV0YWlsL3N0YXRlLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9sb2dnZXIuaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CisKK25hbWVzcGFjZSBwc3luYyB7CisKK05ETl9MT0dfSU5JVChwc3luYy5Db25zdW1lcik7CisKK0NvbnN1bWVyOjpDb25zdW1lcihjb25zdCBuZG46Ok5hbWUmIHN5bmNQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgbmRuOjpGYWNlJiBmYWNlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlY2VpdmVIZWxsb0NhbGxiYWNrJiBvblJlY2VpdmVIZWxsb0RhdGEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVXBkYXRlQ2FsbGJhY2smIG9uVXBkYXRlLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgZmFsc2VfcG9zaXRpdmUgPSAwLjAwMSwKKyAgICAgICAgICAgICAgICAgICBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBoZWxsb0ludGVyZXN0TGlmZXRpbWUsCisgICAgICAgICAgICAgICAgICAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgc3luY0ludGVyZXN0TGlmZXRpbWUpCisgOiBtX2ZhY2UoZmFjZSkKKyAsIG1fc2NoZWR1bGVyKG1fZmFjZS5nZXRJb1NlcnZpY2UoKSkKKyAsIG1fc3luY1ByZWZpeChzeW5jUHJlZml4KQorICwgbV9oZWxsb0ludGVyZXN0UHJlZml4KG5kbjo6TmFtZShtX3N5bmNQcmVmaXgpLmFwcGVuZCgiaGVsbG8iKSkKKyAsIG1fc3luY0ludGVyZXN0UHJlZml4KG5kbjo6TmFtZShtX3N5bmNQcmVmaXgpLmFwcGVuZCgic3luYyIpKQorICwgbV9vblJlY2VpdmVIZWxsb0RhdGEob25SZWNlaXZlSGVsbG9EYXRhKQorICwgbV9vblVwZGF0ZShvblVwZGF0ZSkKKyAsIG1fYmxvb21GaWx0ZXIoY291bnQsIGZhbHNlX3Bvc2l0aXZlKQorICwgbV9oZWxsb0ludGVyZXN0TGlmZXRpbWUoaGVsbG9JbnRlcmVzdExpZmV0aW1lKQorICwgbV9zeW5jSW50ZXJlc3RMaWZldGltZShzeW5jSW50ZXJlc3RMaWZldGltZSkKKyAsIG1fcm5nKHN0ZDo6cmFuZG9tX2RldmljZXt9KCkpCisgLCBtX3JhbmdlVW5pZm9ybVJhbmRvbSgxMDAsIDUwMCkKK3sKK30KKworYm9vbAorQ29uc3VtZXI6OmFkZFN1YnNjcmlwdGlvbihjb25zdCBuZG46Ok5hbWUmIHByZWZpeCkKK3sKKyAgYXV0byBpdCA9IG1fcHJlZml4ZXMuaW5zZXJ0KHN0ZDo6cGFpcjxuZG46Ok5hbWUsIHVpbnQ2NF90PihwcmVmaXgsIDApKTsKKyAgaWYgKCFpdC5zZWNvbmQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbV9zdWJzY3JpcHRpb25MaXN0Lmluc2VydChwcmVmaXgpOworICBtX2Jsb29tRmlsdGVyLmluc2VydChwcmVmaXgudG9VcmkoKSk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkCitDb25zdW1lcjo6c2VuZEhlbGxvSW50ZXJlc3QoKQoreworICBuZG46OkludGVyZXN0IGhlbGxvSW50ZXJlc3QobV9oZWxsb0ludGVyZXN0UHJlZml4KTsKKyAgaGVsbG9JbnRlcmVzdC5zZXRJbnRlcmVzdExpZmV0aW1lKG1faGVsbG9JbnRlcmVzdExpZmV0aW1lKTsKKyAgaGVsbG9JbnRlcmVzdC5zZXRDYW5CZVByZWZpeCh0cnVlKTsKKyAgaGVsbG9JbnRlcmVzdC5zZXRNdXN0QmVGcmVzaCh0cnVlKTsKKworICBORE5fTE9HX0RFQlVHKCJTZW5kIEhlbGxvIEludGVyZXN0ICIgPDwgaGVsbG9JbnRlcmVzdCk7CisKKyAgbV9mYWNlLmV4cHJlc3NJbnRlcmVzdChoZWxsb0ludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmQ29uc3VtZXI6Om9uSGVsbG9EYXRhLCB0aGlzLCBfMSwgXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmQ29uc3VtZXI6Om9uTmFja0ZvckhlbGxvLCB0aGlzLCBfMSwgXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmQ29uc3VtZXI6Om9uSGVsbG9UaW1lb3V0LCB0aGlzLCBfMSkpOworfQorCit2b2lkCitDb25zdW1lcjo6b25IZWxsb0RhdGEoY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QsIGNvbnN0IG5kbjo6RGF0YSYgZGF0YSkKK3sKKyAgbmRuOjpOYW1lIGhlbGxvRGF0YU5hbWUgPSBkYXRhLmdldE5hbWUoKTsKKworICBORE5fTE9HX0RFQlVHKCJPbiBIZWxsbyBEYXRhIik7CisKKyAgLy8gRXh0cmFjdCBJQkYgZnJvbSBuYW1lIHdoaWNoIGlzIHRoZSBsYXN0IGVsZW1lbnQgaW4gaGVsbG8gZGF0YSdzIG5hbWUKKyAgbV9pYmx0ID0gaGVsbG9EYXRhTmFtZS5nZXRTdWJOYW1lKGhlbGxvRGF0YU5hbWUuc2l6ZSgpLTEsIDEpOworCisgIE5ETl9MT0dfVFJBQ0UoIm1faWJsdDogIiA8PCBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+e30obV9pYmx0LnRvVXJpKCkpKTsKKworICBTdGF0ZSBzdGF0ZShkYXRhLmdldENvbnRlbnQoKSk7CisKKyAgTkROX0xPR19ERUJVRygiQ29udGVudDogIiA8PCBzdGF0ZSk7CisKKyAgbV9vblJlY2VpdmVIZWxsb0RhdGEoc3RhdGUuZ2V0Q29udGVudCgpKTsKK30KKwordm9pZAorQ29uc3VtZXI6OnNlbmRTeW5jSW50ZXJlc3QoKQoreworICBCT09TVF9BU1NFUlQoIW1faWJsdC5lbXB0eSgpKTsKKworICBuZG46Ok5hbWUgc3luY0ludGVyZXN0TmFtZShtX3N5bmNJbnRlcmVzdFByZWZpeCk7CisKKyAgLy8gQXBwZW5kIHN1YnNjcmlwdGlvbiBsaXN0CisgIG1fYmxvb21GaWx0ZXIuYXBwZW5kVG9OYW1lKHN5bmNJbnRlcmVzdE5hbWUpOworCisgIC8vIEFwcGVuZCBJQkYgcmVjZWl2ZWQgaW4gaGVsbG8vc3luYyBkYXRhCisgIHN5bmNJbnRlcmVzdE5hbWUuYXBwZW5kKG1faWJsdCk7CisKKyAgbmRuOjpJbnRlcmVzdCBzeW5jSW50ZXJlc3Qoc3luY0ludGVyZXN0TmFtZSk7CisgIHN5bmNJbnRlcmVzdC5zZXRJbnRlcmVzdExpZmV0aW1lKG1fc3luY0ludGVyZXN0TGlmZXRpbWUpOworICBzeW5jSW50ZXJlc3Quc2V0Q2FuQmVQcmVmaXgodHJ1ZSk7CisgIHN5bmNJbnRlcmVzdC5zZXRNdXN0QmVGcmVzaCh0cnVlKTsKKworICBORE5fTE9HX0RFQlVHKCJzZW5kU3luY0ludGVyZXN0LCBub25jZTogIiA8PCBzeW5jSW50ZXJlc3QuZ2V0Tm9uY2UoKSA8PAorICAgICAgICAgICAgICAgICIgaGFzaDogIiA8PCBzdGQ6Omhhc2g8c3RkOjpzdHJpbmc+e30oc3luY0ludGVyZXN0LmdldE5hbWUoKS50b1VyaSgpKSk7CisKKyAgLy8gUmVtb3ZlIGxhc3QgcGVuZGluZyBpbnRlcmVzdCBiZWZvcmUgc2VuZGluZyBhIG5ldyBvbmUKKyAgaWYgKG1fb3V0c3RhbmRpbmdJbnRlcmVzdElkICE9IG51bGxwdHIpIHsKKyAgICAgIG1fZmFjZS5yZW1vdmVQZW5kaW5nSW50ZXJlc3QobV9vdXRzdGFuZGluZ0ludGVyZXN0SWQpOworICAgICAgbV9vdXRzdGFuZGluZ0ludGVyZXN0SWQgPSBudWxscHRyOworICB9CisKKyAgbV9vdXRzdGFuZGluZ0ludGVyZXN0SWQgPSBtX2ZhY2UuZXhwcmVzc0ludGVyZXN0KHN5bmNJbnRlcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmQ29uc3VtZXI6Om9uU3luY0RhdGEsIHRoaXMsIF8xLCBfMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJkNvbnN1bWVyOjpvbk5hY2tGb3JTeW5jLCB0aGlzLCBfMSwgXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZDb25zdW1lcjo6b25TeW5jVGltZW91dCwgdGhpcywgXzEpKTsKK30KKwordm9pZAorQ29uc3VtZXI6Om9uU3luY0RhdGEoY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QsIGNvbnN0IG5kbjo6RGF0YSYgZGF0YSkKK3sKKyAgbmRuOjpOYW1lIHN5bmNEYXRhTmFtZSA9IGRhdGEuZ2V0TmFtZSgpOworCisgIC8vIEV4dHJhY3QgSUJGIGZyb20gc3luYyBkYXRhIG5hbWUgd2hpY2ggaXMgdGhlIGxhc3QgY29tcG9uZW50CisgIG1faWJsdCA9IHN5bmNEYXRhTmFtZS5nZXRTdWJOYW1lKHN5bmNEYXRhTmFtZS5zaXplKCktMSwgMSk7CisKKyAgaWYgKGRhdGEuZ2V0Q29udGVudFR5cGUoKSA9PSBuZG46OnRsdjo6Q29udGVudFR5cGVfTmFjaykgeworICAgIE5ETl9MT0dfREVCVUcoIlJlY2VpdmVkIGFwcGxpY2F0aW9uIE5hY2sgZnJvbSBwcm9kdWNlciwgcmVuZXcgc3luYyBpbnRlcmVzdCIpOworICAgIHNlbmRTeW5jSW50ZXJlc3QoKTsKKyAgICByZXR1cm47CisgIH0KKworICBTdGF0ZSBzdGF0ZShkYXRhLmdldENvbnRlbnQoKSk7CisgIHN0ZDo6dmVjdG9yIDxNaXNzaW5nRGF0YUluZm8+IHVwZGF0ZXM7CisKKyAgZm9yIChjb25zdCBhdXRvJiBjb250ZW50IDogc3RhdGUuZ2V0Q29udGVudCgpKSB7CisgICAgTkROX0xPR19ERUJVRyhjb250ZW50KTsKKyAgICBuZG46Ok5hbWUgcHJlZml4ID0gY29udGVudC5nZXRQcmVmaXgoLTEpOworICAgIHVpbnQ2NF90IHNlcSA9IGNvbnRlbnQuZ2V0KGNvbnRlbnQuc2l6ZSgpLTEpLnRvTnVtYmVyKCk7CisgICAgaWYgKG1fcHJlZml4ZXMuZmluZChwcmVmaXgpID09IG1fcHJlZml4ZXMuZW5kKCkgfHwgc2VxID4gbV9wcmVmaXhlc1twcmVmaXhdKSB7CisgICAgICAvLyBJZiB0aGlzIGlzIGp1c3QgdGhlIG5leHQgc2VxIG51bWJlciB0aGVuIHdlIGhhZCBhbHJlYWR5IGluZm9ybWVkIHRoZSBjb25zdW1lciBhYm91dAorICAgICAgLy8gdGhlIHByZXZpb3VzIHNlcXVlbmNlIG51bWJlciBhbmQgaGVuY2Ugc2VxIGxvdyBhbmQgc2VxIGhpZ2ggc2hvdWxkIGJlIGVxdWFsIHRvIGN1cnJlbnQgc2VxCisgICAgICB1cGRhdGVzLnB1c2hfYmFjayhNaXNzaW5nRGF0YUluZm97cHJlZml4LCBtX3ByZWZpeGVzW3ByZWZpeF0gKyAxLCBzZXF9KTsKKyAgICAgIG1fcHJlZml4ZXNbcHJlZml4XSA9IHNlcTsKKyAgICB9CisgICAgLy8gRWxzZSB1cGRhdGVzIHdpbGwgYmUgZW1wdHkgYW5kIGNvbnN1bWVyIHdpbGwgbm90IGJlIG5vdGlmaWVkLgorICB9CisKKyAgTkROX0xPR19ERUJVRygiU3luYyBEYXRhOiAgIiA8PCBzdGF0ZSk7CisKKyAgaWYgKCF1cGRhdGVzLmVtcHR5KCkpIHsKKyAgICBtX29uVXBkYXRlKHVwZGF0ZXMpOworICB9CisKKyAgc2VuZFN5bmNJbnRlcmVzdCgpOworfQorCit2b2lkCitDb25zdW1lcjo6b25IZWxsb1RpbWVvdXQoY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QpCit7CisgIE5ETl9MT0dfREVCVUcoIm9uIGhlbGxvIHRpbWVvdXQiKTsKKyAgdGhpcy0+c2VuZEhlbGxvSW50ZXJlc3QoKTsKK30KKwordm9pZAorQ29uc3VtZXI6Om9uU3luY1RpbWVvdXQoY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QpCit7CisgIE5ETl9MT0dfREVCVUcoIm9uIHN5bmMgdGltZW91dCAiIDw8IGludGVyZXN0LmdldE5vbmNlKCkpOworCisgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIGFmdGVyKG1fcmFuZ2VVbmlmb3JtUmFuZG9tKG1fcm5nKSk7CisgIG1fc2NoZWR1bGVyLnNjaGVkdWxlRXZlbnQoYWZ0ZXIsIFt0aGlzXSB7IHNlbmRTeW5jSW50ZXJlc3QoKTsgfSk7Cit9CisKK3ZvaWQKK0NvbnN1bWVyOjpvbk5hY2tGb3JIZWxsbyhjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCwgY29uc3QgbmRuOjpscDo6TmFjayYgbmFjaykKK3sKKyAgTkROX0xPR19ERUJVRygicmVjZWl2ZWQgTmFjayB3aXRoIHJlYXNvbiAiIDw8IG5hY2suZ2V0UmVhc29uKCkgPDwKKyAgICAgICAgICAgICAgICAiIGZvciBpbnRlcmVzdCAiIDw8IGludGVyZXN0IDw8IHN0ZDo6ZW5kbCk7CisKKyAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgYWZ0ZXIobV9yYW5nZVVuaWZvcm1SYW5kb20obV9ybmcpKTsKKyAgbV9zY2hlZHVsZXIuc2NoZWR1bGVFdmVudChhZnRlciwgW3RoaXNdIHsgc2VuZEhlbGxvSW50ZXJlc3QoKTsgfSk7Cit9CisKK3ZvaWQKK0NvbnN1bWVyOjpvbk5hY2tGb3JTeW5jKGNvbnN0IG5kbjo6SW50ZXJlc3QmIGludGVyZXN0LCBjb25zdCBuZG46OmxwOjpOYWNrJiBuYWNrKQoreworICBORE5fTE9HX0RFQlVHKCJyZWNlaXZlZCBOYWNrIHdpdGggcmVhc29uICIgPDwgbmFjay5nZXRSZWFzb24oKSA8PAorICAgICAgICAgICAgICAgICIgZm9yIGludGVyZXN0ICIgPDwgaW50ZXJlc3QgPDwgc3RkOjplbmRsKTsKKworICBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBhZnRlcihtX3JhbmdlVW5pZm9ybVJhbmRvbShtX3JuZykpOworICBtX3NjaGVkdWxlci5zY2hlZHVsZUV2ZW50KGFmdGVyLCBbdGhpc10geyBzZW5kU3luY0ludGVyZXN0KCk7IH0pOworfQorCit9IC8vIG5hbWVzcGFjZSBwc3luYwpkaWZmIC0tZ2l0IGEvc3JjL2NvbnN1bWVyLmhwcCBiL3NyYy9jb25zdW1lci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4MjVhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb25zdW1lci5ocHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgUFN5bmMuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBQU3luYyBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogUFN5bmMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogUFN5bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogUFN5bmMsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2lmbmRlZiBQU1lOQ19DT05TVU1FUl9IUFAKKyNkZWZpbmUgUFNZTkNfQ09OU1VNRVJfSFBQCisKKyNpbmNsdWRlICJkZXRhaWwvYmxvb20tZmlsdGVyLmhwcCIKKyNpbmNsdWRlICJkZXRhaWwvdXRpbC5ocHAiCisjaW5jbHVkZSAiZGV0YWlsL3Rlc3QtYWNjZXNzLWNvbnRyb2wuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC9mYWNlLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvc2NoZWR1bGVyLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvdGltZS5ocHA+CisKKyNpbmNsdWRlIDxyYW5kb20+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHBzeW5jIHsKKwordXNpbmcgbmFtZXNwYWNlIG5kbjo6bGl0ZXJhbHM6OnRpbWVfbGl0ZXJhbHM7CisKK3R5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dmVjdG9yPG5kbjo6TmFtZT4mKT4gUmVjZWl2ZUhlbGxvQ2FsbGJhY2s7Cit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnZlY3RvcjxNaXNzaW5nRGF0YUluZm8+Jik+IFVwZGF0ZUNhbGxiYWNrOworCitjb25zdCBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBIRUxMT19JTlRFUkVTVF9MSUZFVElNRSA9IDFfczsKK2NvbnN0IG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIFNZTkNfSU5URVJFU1RfTElGRVRJTUUgPSAxX3M7CisKKy8qKgorICogQGJyaWVmIENvbnN1bWVyIGxvZ2ljIHRvIHN1YnNjcmliZSB0byBwcm9kdWNlcidzIGRhdGEKKyAqCisgKiBBcHBsaWNhdGlvbiBuZWVkcyB0byBjYWxsIHNlbmRIZWxsb0ludGVyZXN0IHRvIGdldCB0aGUgc3Vic2NyaXB0aW9uIGxpc3QKKyAqIGluIFJlY2VpdmVIZWxsb0NhbGxiYWNrLiBJdCBjYW4gdGhlbiBhZGQgdGhlIGRlc2lyZWQgbmFtZXMgdXNpbmcgYWRkU3Vic2NyaXB0aW9uLgorICogRmluYWxseSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgc2VuZFN5bmNJbnRlcmVzdC4gSWYgdGhlIGFwcGxpY2F0aW9uIGFkZHMgc29tZXRoaW5nCisgKiBsYXRlciB0byB0aGUgc3Vic2NyaXB0aW9uIGxpc3QgdGhlbiBpdCBtYXkgY2FsbCBzZW5kU3luY0ludGVyZXN0IGFnYWluIGZvcgorICogc2VuZGluZyB0aGUgbmV4dCBzeW5jIGludGVyZXN0IHdpdGggdXBkYXRlZCBJQkYgaW1tZWRpYXRlbHkgdG8gcmVkdWNlIGFueSBkZWxheSBpbiBzeW5jIGRhdGEuCisgKiBXaGVuZXZlciB0aGVyZSBpcyBuZXcgZGF0YSBVcGRhdGVDYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uLgorICogQ3VycmVudGx5LCBmZXRjaGluZyBvZiB0aGUgZGF0YSBuZWVkcyB0byBiZSBoYW5kbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAqLworY2xhc3MgQ29uc3VtZXIKK3sKK3B1YmxpYzoKKyAgLyoqCisgICAqIEBicmllZiBjb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gc3luY1ByZWZpeCBzeW5jUHJlZml4IHRvIHNlbmQgaGVsbG8vc3luYyBpbnRlcmVzdHMgdG8gcHJvZHVjZXIKKyAgICogQHBhcmFtIGZhY2UgYXBwbGljYXRpb24ncyBmYWNlCisgICAqIEBwYXJhbSBvblJlY2VpdmVIZWxsb0RhdGEgY2FsbCBiYWNrIHRvIGdpdmUgaGVsbG8gZGF0YSBiYWNrIHRvIGFwcGxpY2F0aW9uCisgICAqIEBwYXJhbSBvblVwZGF0ZSBjYWxsIGJhY2sgdG8gZ2l2ZSBzeW5jIGRhdGEgYmFjayB0byBhcHBsaWNhdGlvbgorICAgKiBAcGFyYW0gY291bnQgYmxvb20gZmlsdGVyIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cyAoc3Vic2NyaXB0aW9ucykgaW4gYmxvb20gZmlsdGVyCisgICAqIEBwYXJhbSBmYWxzZV9wb3NpdGl2ZSBibG9vbSBmaWx0ZXIgZmFsc2UgcG9zaXRpdmUgcHJvYmFiaWxpdHkKKyAgICogQHBhcmFtIGhlbGxvSW50ZXJlc3RMaWZldGltZSBsaWZldGltZSBvZiBoZWxsbyBpbnRlcmVzdAorICAgKiBAcGFyYW0gc3luY0ludGVyZXN0TGlmZXRpbWUgbGlmZXRpbWUgb2Ygc3luYyBpbnRlcmVzdAorICAgKi8KKyAgQ29uc3VtZXIoY29uc3QgbmRuOjpOYW1lJiBzeW5jUHJlZml4LAorICAgICAgICAgICBuZG46OkZhY2UmIGZhY2UsCisgICAgICAgICAgIGNvbnN0IFJlY2VpdmVIZWxsb0NhbGxiYWNrJiBvblJlY2VpdmVIZWxsb0RhdGEsCisgICAgICAgICAgIGNvbnN0IFVwZGF0ZUNhbGxiYWNrJiBvblVwZGF0ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGNvdW50LAorICAgICAgICAgICBkb3VibGUgZmFsc2VfcG9zaXRpdmUsCisgICAgICAgICAgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIGhlbGxvSW50ZXJlc3RMaWZldGltZSA9IEhFTExPX0lOVEVSRVNUX0xJRkVUSU1FLAorICAgICAgICAgICBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBzeW5jSW50ZXJlc3RMaWZldGltZSA9IFNZTkNfSU5URVJFU1RfTElGRVRJTUUpOworCisgIC8qKgorICAgKiBAYnJpZWYgc2VuZCBoZWxsbyBpbnRlcmVzdCAvPHN5bmMtcHJlZml4Pi9oZWxsby8KKyAgICoKKyAgICogU2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgYXBwbGljYXRpb24gd2hlbmV2ZXIgaXQgd2FudHMgdG8gc2VuZCBhIGhlbGxvCisgICAqLworICB2b2lkCisgIHNlbmRIZWxsb0ludGVyZXN0KCk7CisKKyAgLyoqCisgICAqIEBicmllZiBzZW5kIHN5bmMgaW50ZXJlc3QgLzxzeW5jLXByZWZpeD4vc3luYy9cPEJGXD4vXDxwcm9kdWNlcnMtSUJGXD4KKyAgICoKKyAgICogU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdWJzY3JpcHRpb24gbGlzdCBpcyBzZXQgb3IgdXBkYXRlZAorICAgKi8KKyAgdm9pZAorICBzZW5kU3luY0ludGVyZXN0KCk7CisKKyAgLyoqCisgICAqIEBicmllZiBBZGQgcHJlZml4IHRvIHN1YnNjcmlwdGlvbiBsaXN0CisgICAqCisgICAqIEBwYXJhbSBwcmVmaXggcHJlZml4IHRvIGJlIGFkZGVkIHRvIHRoZSBsaXN0CisgICAqLworICBib29sCisgIGFkZFN1YnNjcmlwdGlvbihjb25zdCBuZG46Ok5hbWUmIHByZWZpeCk7CisKKyAgc3RkOjpzZXQ8bmRuOjpOYW1lPgorICBnZXRTdWJzY3JpcHRpb25MaXN0KCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX3N1YnNjcmlwdGlvbkxpc3Q7CisgIH0KKworICBib29sCisgIGlzU3Vic2NyaWJlZChjb25zdCBuZG46Ok5hbWUmIHByZWZpeCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX3N1YnNjcmlwdGlvbkxpc3QuZmluZChwcmVmaXgpICE9IG1fc3Vic2NyaXB0aW9uTGlzdC5lbmQoKTsKKyAgfQorCisgIG5kbjo6b3B0aW9uYWw8dWludDY0X3Q+CisgIGdldFNlcU5vKGNvbnN0IG5kbjo6TmFtZSYgcHJlZml4KSBjb25zdAorICB7CisgICAgYXV0byBpdCA9IG1fcHJlZml4ZXMuZmluZChwcmVmaXgpOworICAgIGlmIChpdCA9PSBtX3ByZWZpeGVzLmVuZCgpKSB7CisgICAgICByZXR1cm4gbmRuOjpudWxsb3B0OworICAgIH0KKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogQGJyaWVmIEdldCBoZWxsbyBkYXRhIGZyb20gdGhlIHByb2R1Y2VyCisgICAqCisgICAqIEZvcm1hdDogLzxzeW5jLXByZWZpeD4vaGVsbG8vXDxCRlw+L1w8cHJvZHVjZXItSUJGXD4KKyAgICogRGF0YSBjb250ZW50IGlzIGFsbCB0aGUgcHJlZml4ZXMgdGhlIHByb2R1Y2VyIGhhcy4KKyAgICogV2Ugc3RvcmUgdGhlIHByb2R1Y2VyJ3MgSUJGIHRvIGJlIHVzZWQgaW4gc2VuZGluZyBzeW5jIGludGVyZXN0CisgICAqCisgICAqIG1fb25SZWNlaXZlSGVsbG9EYXRhIGlzIGNhbGxlZCB0byBsZXQgdGhlIGFwcGxpY2F0aW9uIGtub3cKKyAgICogc28gdGhhdCBpdCBjYW4gc2V0IHRoZSBzdWJzY3JpcHRpb24gbGlzdCB1c2luZyBhZGRTdWJzY3JpcHRpb24KKyAgICoKKyAgICogQHBhcmFtIGludGVyZXN0IGhlbGxvIGludGVyZXN0CisgICAqIEBwYXJhbSBkYXRhIGhlbGxvIGRhdGEKKyAgICovCisgIHZvaWQKKyAgb25IZWxsb0RhdGEoY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QsIGNvbnN0IG5kbjo6RGF0YSYgZGF0YSk7CisKKyAgLyoqCisgICAqIEBicmllZiBHZXQgaGVsbG8gZGF0YSBmcm9tIHRoZSBwcm9kdWNlcgorICAgKgorICAgKiBGb3JtYXQ6IDxzeW5jLXByZWZpeD4vc3luYy9cPEJGXD4vXDxwcm9kdWNlcnMtSUJGXD4vXDxwcm9kdWNlcnMtbGF0ZXN0LUlCRlw+CisgICAqIERhdGEgY29udGVudCBpcyBhbGwgdGhlIHByZWZpeGVzIHRoZSBwcm9kdWNlciB0aGlua3MgdGhlIGNvbnN1bWVyIGRvZXNuJ3QgaGF2ZQorICAgKiBoYXZlIHRoZSBsYXRlc3QgdXBkYXRlIGZvci4gV2UgdXBkYXRlIG91ciBjb3B5IG9mIHByb2R1Y2VyJ3MgSUJGIHdpdGggdGhlIGxhdGVzdCBvbmUuCisgICAqIFRoZW4gd2Ugc2VuZCBhbm90aGVyIHN5bmMgaW50ZXJlc3QgYWZ0ZXIgYSByYW5kb20gaml0dGVyLgorICAgKgorICAgKiBAcGFyYW0gaW50ZXJlc3Qgc3luYyBpbnRlcmVzdAorICAgKiBAcGFyYW0gZGF0YSBzeW5jIGRhdGEKKyAgICovCisgIHZvaWQKKyAgb25TeW5jRGF0YShjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCwgY29uc3QgbmRuOjpEYXRhJiBkYXRhKTsKKworICB2b2lkCisgIG9uSGVsbG9UaW1lb3V0KGNvbnN0IG5kbjo6SW50ZXJlc3QmIGludGVyZXN0KTsKKworICB2b2lkCisgIG9uU3luY1RpbWVvdXQoY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QpOworCisgIHZvaWQKKyAgb25OYWNrRm9ySGVsbG8oY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QsIGNvbnN0IG5kbjo6bHA6Ok5hY2smIG5hY2spOworCisgIHZvaWQKKyAgb25OYWNrRm9yU3luYyhjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCwgY29uc3QgbmRuOjpscDo6TmFjayYgbmFjayk7CisKK1BVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJJVkFURToKKyAgbmRuOjpGYWNlJiBtX2ZhY2U7CisgIG5kbjo6U2NoZWR1bGVyIG1fc2NoZWR1bGVyOworCisgIG5kbjo6TmFtZSBtX3N5bmNQcmVmaXg7CisgIG5kbjo6TmFtZSBtX2hlbGxvSW50ZXJlc3RQcmVmaXg7CisgIG5kbjo6TmFtZSBtX3N5bmNJbnRlcmVzdFByZWZpeDsKKyAgbmRuOjpOYW1lIG1faWJsdDsKKworICBSZWNlaXZlSGVsbG9DYWxsYmFjayBtX29uUmVjZWl2ZUhlbGxvRGF0YTsKKworICAvLyBDYWxsZWQgd2hlbiBuZXcgc3luYyB1cGRhdGUgaXMgcmVjZWl2ZWQgZnJvbSBwcm9kdWNlci4KKyAgVXBkYXRlQ2FsbGJhY2sgbV9vblVwZGF0ZTsKKworICAvLyBCbG9vbSBmaWx0ZXIgaXMgdXNlZCB0byBzdG9yZSBhcHBsaWNhdGlvbi91c2VyJ3Mgc3Vic2NyaXB0aW9uIGxpc3QuCisgIEJsb29tRmlsdGVyIG1fYmxvb21GaWx0ZXI7CisKKyAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgbV9oZWxsb0ludGVyZXN0TGlmZXRpbWU7CisgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIG1fc3luY0ludGVyZXN0TGlmZXRpbWU7CisKKyAgLy8gU3RvcmUgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgcHJlZml4LgorICBzdGQ6Om1hcDxuZG46Ok5hbWUsIHVpbnQ2NF90PiBtX3ByZWZpeGVzOworICBzdGQ6OnNldDxuZG46Ok5hbWU+IG1fc3Vic2NyaXB0aW9uTGlzdDsKKworICBjb25zdCBuZG46OlBlbmRpbmdJbnRlcmVzdElkKiBtX291dHN0YW5kaW5nSW50ZXJlc3RJZDsKKworICBzdGQ6Om10MTk5MzcgbV9ybmc7CisgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4gbV9yYW5nZVVuaWZvcm1SYW5kb207Cit9OworCit9IC8vIG5hbWVzcGFjZSBwc3luYworCisjZW5kaWYgLy8gUFNZTkNfQ09OU1VNRVJfSFBQCmRpZmYgLS1naXQgYS9zcmMvZGV0YWlsL2Jsb29tLWZpbHRlci5jcHAgYi9zcmMvZGV0YWlsL2Jsb29tLWZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0YTAwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9kZXRhaWwvYmxvb20tZmlsdGVyLmNwcApAQCAtMCwwICsxLDM0OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBQU3luYy4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIFBTeW5jIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBQU3luYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBQU3luYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBQU3luYywgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKworICogVGhpcyBmaWxlIGluY29ycG9yYXRlcyB3b3JrIGNvdmVyZWQgYnkgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kCisgKiBwZXJtaXNzaW9uIG5vdGljZToKKworICogVGhlIE1JVCBMaWNlbnNlIChNSVQpCisKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBcmFzaCBQYXJ0b3cKKworICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisqLworCisjaW5jbHVkZSAiYmxvb20tZmlsdGVyLmhwcCIKKyNpbmNsdWRlICJ1dGlsLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9sb2dnZXIuaHBwPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGNzdGRsaWI+CisKKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BcmFzaFBhcnRvdy9ibG9vbQorCitORE5fTE9HX0lOSVQocHN5bmMuQmxvb21GaWx0ZXIpOworCituYW1lc3BhY2UgcHN5bmMgeworCitzdGF0aWMgY29uc3Qgc3RkOjpzaXplX3QgYml0c19wZXJfY2hhciA9IDB4MDg7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBiaXRfbWFza1tiaXRzX3Blcl9jaGFyXSA9IHsKKyAgMHgwMSwgIC8vMDAwMDAwMDEKKyAgMHgwMiwgIC8vMDAwMDAwMTAKKyAgMHgwNCwgIC8vMDAwMDAxMDAKKyAgMHgwOCwgIC8vMDAwMDEwMDAKKyAgMHgxMCwgIC8vMDAwMTAwMDAKKyAgMHgyMCwgIC8vMDAxMDAwMDAKKyAgMHg0MCwgIC8vMDEwMDAwMDAKKyAgMHg4MCAgIC8vMTAwMDAwMDAKK307CisKK0Jsb29tUGFyYW1ldGVyczo6Qmxvb21QYXJhbWV0ZXJzKCkKKzogbWluaW11bV9zaXplKDEpCissIG1heGltdW1fc2l6ZShzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkIGludD46Om1heCgpKQorLCBtaW5pbXVtX251bWJlcl9vZl9oYXNoZXMoMSkKKywgbWF4aW11bV9udW1iZXJfb2ZfaGFzaGVzKHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQgaW50Pjo6bWF4KCkpCissIHByb2plY3RlZF9lbGVtZW50X2NvdW50KDIwMCkKKywgZmFsc2VfcG9zaXRpdmVfcHJvYmFiaWxpdHkoMS4wIC8gcHJvamVjdGVkX2VsZW1lbnRfY291bnQpCissIHJhbmRvbV9zZWVkKDB4QTVBNUE1QTU1QTVBNUE1QVVMTCkKK3t9CisKK2Jvb2wKK0Jsb29tUGFyYW1ldGVyczo6Y29tcHV0ZV9vcHRpbWFsX3BhcmFtZXRlcnMoKQoreworICBpZiAoISgqdGhpcykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkb3VibGUgbWluX20gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgIGRvdWJsZSBtaW5fayA9IDAuMDsKKyAgZG91YmxlIGN1cnJfbSA9IDAuMDsKKyAgZG91YmxlIGsgPSAxLjA7CisKKyAgd2hpbGUgKGsgPCAxMDAwLjApCisgIHsKKyAgICBkb3VibGUgbnVtZXJhdG9yICAgPSAoLSBrICogcHJvamVjdGVkX2VsZW1lbnRfY291bnQpOworICAgIGRvdWJsZSBkZW5vbWluYXRvciA9IHN0ZDo6bG9nKDEuMCAtIHN0ZDo6cG93KGZhbHNlX3Bvc2l0aXZlX3Byb2JhYmlsaXR5LCAxLjAgLyBrKSk7CisgICAgY3Vycl9tID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7CisgICAgaWYgKGN1cnJfbSA8IG1pbl9tKQorICAgIHsKKyAgICAgIG1pbl9tID0gY3Vycl9tOworICAgICAgbWluX2sgPSBrOworICAgIH0KKyAgICBrICs9IDEuMDsKKyAgfQorCisgIG9wdGltYWxfcGFyYW1ldGVyc190JiBvcHRwID0gb3B0aW1hbF9wYXJhbWV0ZXJzOworCisgIG9wdHAubnVtYmVyX29mX2hhc2hlcyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4obWluX2spOworICBvcHRwLnRhYmxlX3NpemUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KG1pbl9tKTsKKyAgb3B0cC50YWJsZV9zaXplICs9ICgoKG9wdHAudGFibGVfc2l6ZSAlIGJpdHNfcGVyX2NoYXIpICE9IDApID8gKGJpdHNfcGVyX2NoYXIgLSAob3B0cC50YWJsZV9zaXplICUgYml0c19wZXJfY2hhcikpIDogMCk7CisKKyAgaWYgKG9wdHAubnVtYmVyX29mX2hhc2hlcyA8IG1pbmltdW1fbnVtYmVyX29mX2hhc2hlcykKKyAgICAgb3B0cC5udW1iZXJfb2ZfaGFzaGVzID0gbWluaW11bV9udW1iZXJfb2ZfaGFzaGVzOworICBlbHNlIGlmIChvcHRwLm51bWJlcl9vZl9oYXNoZXMgPiBtYXhpbXVtX251bWJlcl9vZl9oYXNoZXMpCisgICAgIG9wdHAubnVtYmVyX29mX2hhc2hlcyA9IG1heGltdW1fbnVtYmVyX29mX2hhc2hlczsKKworICBpZiAob3B0cC50YWJsZV9zaXplIDwgbWluaW11bV9zaXplKQorICAgICBvcHRwLnRhYmxlX3NpemUgPSBtaW5pbXVtX3NpemU7CisgIGVsc2UgaWYgKG9wdHAudGFibGVfc2l6ZSA+IG1heGltdW1fc2l6ZSkKKyAgICAgb3B0cC50YWJsZV9zaXplID0gbWF4aW11bV9zaXplOworCisgIHJldHVybiB0cnVlOworfQorCitCbG9vbUZpbHRlcjo6Qmxvb21GaWx0ZXIoKQorIDogYml0X3RhYmxlXygwKQorICwgc2FsdF9jb3VudF8oMCkKKyAsIHRhYmxlX3NpemVfKDApCisgLCByYXdfdGFibGVfc2l6ZV8oMCkKKyAsIHByb2plY3RlZF9lbGVtZW50X2NvdW50XygwKQorICwgaW5zZXJ0ZWRfZWxlbWVudF9jb3VudF8oMCkKKyAsIHJhbmRvbV9zZWVkXygwKQorICwgZGVzaXJlZF9mYWxzZV9wb3NpdGl2ZV9wcm9iYWJpbGl0eV8oMC4wKQore30KKworQmxvb21GaWx0ZXI6OkJsb29tRmlsdGVyKGNvbnN0IEJsb29tUGFyYW1ldGVycyYgcCkKKyA6IGJpdF90YWJsZV8oMCkKKyAsIHByb2plY3RlZF9lbGVtZW50X2NvdW50XyhwLnByb2plY3RlZF9lbGVtZW50X2NvdW50KQorICwgaW5zZXJ0ZWRfZWxlbWVudF9jb3VudF8oMCkKKyAsIHJhbmRvbV9zZWVkXygocC5yYW5kb21fc2VlZCAqIDB4QTVBNUE1QTUpICsgMSkKKyAsIGRlc2lyZWRfZmFsc2VfcG9zaXRpdmVfcHJvYmFiaWxpdHlfKHAuZmFsc2VfcG9zaXRpdmVfcHJvYmFiaWxpdHkpCit7CisgIHNhbHRfY291bnRfID0gcC5vcHRpbWFsX3BhcmFtZXRlcnMubnVtYmVyX29mX2hhc2hlczsKKyAgdGFibGVfc2l6ZV8gPSBwLm9wdGltYWxfcGFyYW1ldGVycy50YWJsZV9zaXplOworICBnZW5lcmF0ZV91bmlxdWVfc2FsdCgpOworICByYXdfdGFibGVfc2l6ZV8gPSB0YWJsZV9zaXplXyAvIGJpdHNfcGVyX2NoYXI7CisgIC8vYml0X3RhYmxlXyA9IG5ldyBjZWxsX3R5cGVbc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KHJhd190YWJsZV9zaXplXyldOworICBiaXRfdGFibGVfLnJlc2l6ZShzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4ocmF3X3RhYmxlX3NpemVfKSwgMHgwMCk7Cit9CisKK0Jsb29tRmlsdGVyOjpCbG9vbUZpbHRlcih1bnNpZ25lZCBpbnQgcHJvamVjdGVkX2VsZW1lbnRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGZhbHNlX3Bvc2l0aXZlX3Byb2JhYmlsaXR5KQorIDogQmxvb21GaWx0ZXIoZ2V0UGFyYW1ldGVycyhwcm9qZWN0ZWRfZWxlbWVudF9jb3VudCwgZmFsc2VfcG9zaXRpdmVfcHJvYmFiaWxpdHkpKQoreworfQorCitCbG9vbUZpbHRlcjo6Qmxvb21GaWx0ZXIodW5zaWduZWQgaW50IHByb2plY3RlZF9lbGVtZW50X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmYWxzZV9wb3NpdGl2ZV9wcm9iYWJpbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZG46Om5hbWU6OkNvbXBvbmVudCYgYmZOYW1lKQorIDogQmxvb21GaWx0ZXIocHJvamVjdGVkX2VsZW1lbnRfY291bnQsIGZhbHNlX3Bvc2l0aXZlX3Byb2JhYmlsaXR5KQoreworICBzdGQ6OnZlY3RvcjxCbG9vbUZpbHRlcjo6Y2VsbF90eXBlPiB0YWJsZShiZk5hbWUudmFsdWVfYmVnaW4oKSwgYmZOYW1lLnZhbHVlX2VuZCgpKTsKKworICBpZiAodGFibGUuc2l6ZSgpICE9IHJhd190YWJsZV9zaXplXykgeworICAgIEJPT1NUX1RIUk9XX0VYQ0VQVElPTihFcnJvcigiUmVjZWl2ZWQgQmxvb21GaWx0ZXIgY2Fubm90IGJlIGRlY29kZWQhIikpOworICB9CisgIGJpdF90YWJsZV8gPSB0YWJsZTsKK30KKworQmxvb21QYXJhbWV0ZXJzCitCbG9vbUZpbHRlcjo6Z2V0UGFyYW1ldGVycyh1bnNpZ25lZCBpbnQgcHJvamVjdGVkX2VsZW1lbnRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZmFsc2VfcG9zaXRpdmVfcHJvYmFiaWxpdHkpCit7CisgIEJsb29tUGFyYW1ldGVycyBvcHQ7CisgIG9wdC5mYWxzZV9wb3NpdGl2ZV9wcm9iYWJpbGl0eSA9IGZhbHNlX3Bvc2l0aXZlX3Byb2JhYmlsaXR5OworICBvcHQucHJvamVjdGVkX2VsZW1lbnRfY291bnQgPSBwcm9qZWN0ZWRfZWxlbWVudF9jb3VudDsKKworICBpZiAoIW9wdCkgeworICAgIE5ETl9MT0dfV0FSTigiQmxvb20gcGFyYW1ldGVycyBhcmUgbm90IGNvcnJlY3QhIik7CisgIH0KKworICBvcHQuY29tcHV0ZV9vcHRpbWFsX3BhcmFtZXRlcnMoKTsKKyAgcmV0dXJuIG9wdDsKK30KKwordm9pZAorQmxvb21GaWx0ZXI6OmFwcGVuZFRvTmFtZShuZG46Ok5hbWUmIG5hbWUpIGNvbnN0Cit7CisgIG5hbWUuYXBwZW5kTnVtYmVyKHByb2plY3RlZF9lbGVtZW50X2NvdW50Xyk7CisgIG5hbWUuYXBwZW5kTnVtYmVyKChpbnQpKGRlc2lyZWRfZmFsc2VfcG9zaXRpdmVfcHJvYmFiaWxpdHlfICogMTAwMCkpOworICBuYW1lLmFwcGVuZChiaXRfdGFibGVfLmJlZ2luKCksIGJpdF90YWJsZV8uZW5kKCkpOworfQorCit2b2lkCitCbG9vbUZpbHRlcjo6Y2xlYXIoKQoreworICBiaXRfdGFibGVfLnJlc2l6ZShzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4ocmF3X3RhYmxlX3NpemVfKSwgMHgwMCk7CisgIGluc2VydGVkX2VsZW1lbnRfY291bnRfID0gMDsKK30KKwordm9pZAorQmxvb21GaWx0ZXI6Omluc2VydChjb25zdCBzdGQ6OnN0cmluZyYga2V5KQoreworICBzdGQ6OnNpemVfdCBiaXRfaW5kZXggPSAwOworICBzdGQ6OnNpemVfdCBiaXQgPSAwOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2FsdF8uc2l6ZSgpOyArK2kpCisgIHsKKyAgICAgY29tcHV0ZV9pbmRpY2VzKG11cm11ckhhc2gzKHNhbHRfW2ldLCBrZXkpLCBiaXRfaW5kZXgsIGJpdCk7CisgICAgIGJpdF90YWJsZV9bYml0X2luZGV4L2JpdHNfcGVyX2NoYXJdIHw9IGJpdF9tYXNrW2JpdF07CisgIH0KKyAgKytpbnNlcnRlZF9lbGVtZW50X2NvdW50XzsKK30KKworYm9vbAorQmxvb21GaWx0ZXI6OmNvbnRhaW5zKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpIGNvbnN0Cit7CisgIHN0ZDo6c2l6ZV90IGJpdF9pbmRleCA9IDA7CisgIHN0ZDo6c2l6ZV90IGJpdCA9IDA7CisKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHNhbHRfLnNpemUoKTsgKytpKQorICB7CisgICAgY29tcHV0ZV9pbmRpY2VzKG11cm11ckhhc2gzKHNhbHRfW2ldLCBrZXkpLCBiaXRfaW5kZXgsIGJpdCk7CisgICAgaWYgKChiaXRfdGFibGVfW2JpdF9pbmRleC9iaXRzX3Blcl9jaGFyXSAmIGJpdF9tYXNrW2JpdF0pICE9IGJpdF9tYXNrW2JpdF0pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RkOjp2ZWN0b3IgPEJsb29tRmlsdGVyOjpjZWxsX3R5cGU+CitCbG9vbUZpbHRlcjo6dGFibGUoKSBjb25zdAoreworICByZXR1cm4gYml0X3RhYmxlXzsKK30KKwordm9pZAorQmxvb21GaWx0ZXI6OmdlbmVyYXRlX3VuaXF1ZV9zYWx0KCkKK3sKKyAgLyoKKyAgICBOb3RlOgorICAgIEEgZGlzdGluY3QgaGFzaCBmdW5jdGlvbiBuZWVkIG5vdCBiZSBpbXBsZW1lbnRhdGlvbi13aXNlCisgICAgZGlzdGluY3QuIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uICJzZWVkaW5nIiBhIGNvbW1vbgorICAgIGhhc2ggZnVuY3Rpb24gd2l0aCBkaWZmZXJlbnQgdmFsdWVzIHNlZW1zIHRvIGJlIGFkZXF1YXRlLgorICAqLworICBjb25zdCB1bnNpZ25lZCBpbnQgcHJlZGVmX3NhbHRfY291bnQgPSAxMjg7CisgIHN0YXRpYyBjb25zdCBibG9vbV90eXBlIHByZWRlZl9zYWx0W3ByZWRlZl9zYWx0X2NvdW50XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBQUFBQUFBQSwgMHg1NTU1NTU1NSwgMHgzMzMzMzMzMywgMHhDQ0NDQ0NDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NjY2NjY2NiwgMHg5OTk5OTk5OSwgMHhCNUI1QjVCNSwgMHg0QjRCNEI0QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBQTU1QUE1NSwgMHg1NTMzNTUzMywgMHgzM0NDMzNDQywgMHhDQzY2Q0M2NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2Njk5NjY5OSwgMHg5OUI1OTlCNSwgMHhCNTRCQjU0QiwgMHg0QkFBNEJBQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBQTMzQUEzMywgMHg1NUNDNTVDQywgMHgzMzY2MzM2NiwgMHhDQzk5Q0M5OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2NkI1NjZCNSwgMHg5OTRCOTk0QiwgMHhCNUFBQjVBQSwgMHhBQUFBQUEzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NTU1NTVDQywgMHgzMzMzMzM2NiwgMHhDQ0NDQ0M5OSwgMHg2NjY2NjZCNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5OTk5OTk0QiwgMHhCNUI1QjVBQSwgMHhGRkZGRkZGRiwgMHhGRkZGMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCODIzRDVFQiwgMHhDMTE5MUNERiwgMHhGNjIzQUVCMywgMHhEQjU4NDk5RiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDOEQ0MkU3MCwgMHhCMTczRjYxNiwgMHhBOTFBNTk2NywgMHhEQTQyN0Q2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMUU4QTJFQSwgMHhGNkMwRDE1NSwgMHg0OTA5RkVBMywgMHhBNjhDQzZBNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMzk1RTc4MiwgMHhBMjYwNTdFQiwgMHgwQ0Q1REEyOCwgMHg0NjdDNTQ5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGMTVFNjk4MiwgMHg2MUM2RkFEMywgMHg5NjE1RTM1MiwgMHg2RTlFMzU1QSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2ODlCNTYzRSwgMHgwQzk4MzFBOCwgMHg2NzUzQzE4QiwgMHhBNjIyNjg5QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E2M0M0NywgMHg0MkNDMjg4NCwgMHg4RTg5OTE5QiwgMHg2RURCRDdEMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNUI2Nzk2QywgMHgxRDZGREZFNCwgMHg2M0ZGOTA5MiwgMHhFNzQwMTQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFRkZFOTQxMiwgMHhBRUFFREY3OSwgMHg5RjI0NUEzMSwgMHg4M0MxMzZGQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDM0RBNEE4QywgMHhBNTExMkM4QywgMHg1MjcxRjQ5MSwgMHg5QTk0OERBQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDRUU1OUE4RCwgMHhCNUY1MjVBQiwgMHg1OUQxMzIxNywgMHgyNEU3QzMzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2OTdDMjEwMywgMHg4NEIwQTQ2MCwgMHg4NjE1NkRBOSwgMHhBRUYyQUM2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMzI0M0RBNSwgMHgzRjY0OTY0MywgMHg1RkE0OTVBOCwgMHg2NzcxMERGOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5QTZDNDk5RSwgMHhEQ0ZCMDIyNywgMHg0NkE0MzQzMywgMHgxODMyQjA3QSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDNDZBRkYzQywgMHhCOUM4RkZGMCwgMHhDOTUwMDQ2NywgMHgzNDQzMUJERiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCNjUyNDMyQiwgMHhFMzY3RjEyQiwgMHg0MjdGNEMxQiwgMHgyMjRDMDA2RSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyRTdFNUE4OSwgMHg5NkY5OUFBNSwgMHgwQkVCNDUyQSwgMHgyRkQ4N0MzOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3NEIyRTFGQiwgMHgyMjJFRkQyNCwgMHhGMzU3RjYwQywgMHg0NDBGQ0IxRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkJFMDMwRiwgMHg2NzA0REMyOSwgMHgxMTQ0RDEyRiwgMHg5NDhCMTM1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2RDhGRDdFOSwgMHgxQzExQTAxNCwgMHhBREQxNTkyRiwgMHhGQjNDNzEyRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGQzc3NjQyRiwgMHhGOUM0Q0U4QywgMHgzMTMxMkZCOSwgMHgwOEIwREQ3OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMThGQTZFNywgMHhDMDQwRDIzRCwgMHhDMDU4OUFBNywgMHgwQ0E1QzA3NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGODc0QjE3MiwgMHgwQ0Y5MTRENSwgMHg3ODREMzI4MCwgMHg0RThDRkVCQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDNTY5RjU3NSwgMHhDREIyQTA5MSwgMHgyQ0MwMTZCNCwgMHg1QzVGNDQyMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgIGlmIChzYWx0X2NvdW50XyA8PSBwcmVkZWZfc2FsdF9jb3VudCkKKyAgeworICAgIHN0ZDo6Y29weShwcmVkZWZfc2FsdCwKKyAgICAgICAgICAgICAgcHJlZGVmX3NhbHQgKyBzYWx0X2NvdW50XywKKyAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHNhbHRfKSk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzYWx0Xy5zaXplKCk7ICsraSkKKyAgICB7CisgICAgICBzYWx0X1tpXSA9IHNhbHRfW2ldICogc2FsdF9bKGkgKyAzKSAlIHNhbHRfLnNpemUoKV0gKyBzdGF0aWNfY2FzdDxibG9vbV90eXBlPihyYW5kb21fc2VlZF8pOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBzdGQ6OmNvcHkocHJlZGVmX3NhbHQscHJlZGVmX3NhbHQgKyBwcmVkZWZfc2FsdF9jb3VudCxzdGQ6OmJhY2tfaW5zZXJ0ZXIoc2FsdF8pKTsKKyAgICBzcmFuZChzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHJhbmRvbV9zZWVkXykpOworICAgIHdoaWxlIChzYWx0Xy5zaXplKCkgPCBzYWx0X2NvdW50XykKKyAgICB7CisgICAgICBibG9vbV90eXBlIGN1cnJlbnRfc2FsdCA9IHN0YXRpY19jYXN0PGJsb29tX3R5cGU+KHJhbmQoKSkgKiBzdGF0aWNfY2FzdDxibG9vbV90eXBlPihyYW5kKCkpOworICAgICAgaWYgKDAgPT0gY3VycmVudF9zYWx0KSBjb250aW51ZTsKKyAgICAgIGlmIChzYWx0Xy5lbmQoKSA9PSBzdGQ6OmZpbmQoc2FsdF8uYmVnaW4oKSwgc2FsdF8uZW5kKCksIGN1cnJlbnRfc2FsdCkpCisgICAgICB7CisgICAgICAgIHNhbHRfLnB1c2hfYmFjayhjdXJyZW50X3NhbHQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkCitCbG9vbUZpbHRlcjo6Y29tcHV0ZV9pbmRpY2VzKGNvbnN0IGJsb29tX3R5cGUmIGhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90JiBiaXRfaW5kZXgsIHN0ZDo6c2l6ZV90JiBiaXQpIGNvbnN0Cit7CisgIGJpdF9pbmRleCA9IGhhc2ggJSB0YWJsZV9zaXplXzsKKyAgYml0ID0gYml0X2luZGV4ICUgYml0c19wZXJfY2hhcjsKK30KKworYm9vbAorb3BlcmF0b3I9PShjb25zdCBCbG9vbUZpbHRlciYgYmYxLCBjb25zdCBCbG9vbUZpbHRlciYgYmYyKQoreworICBhdXRvIHRhYmxlMSA9IGJmMS50YWJsZSgpOworICBhdXRvIHRhYmxlMiA9IGJmMi50YWJsZSgpOworCisgIGlmICh0YWJsZTEuc2l6ZSgpICE9IHRhYmxlMi5zaXplKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRhYmxlMS5zaXplKCk7IGkrKykgeworICAgIGlmICh0YWJsZTFbaV0gIT0gdGFibGUyW2ldKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBCbG9vbUZpbHRlciYgYmYpCit7CisgIGZvciAoY29uc3QgYXV0byYgZWxlbWVudCA6IGJmLnRhYmxlKCkpIHsKKyAgICBvdXQgPDwgdW5zaWduZWQoZWxlbWVudCk7CisgIH0KKyAgcmV0dXJuIG91dDsKK30KKworfSAvLyBuYW1lc3BhY2UgcHN5bmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvZGV0YWlsL2Jsb29tLWZpbHRlci5ocHAgYi9zcmMvZGV0YWlsL2Jsb29tLWZpbHRlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5ZjFjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9kZXRhaWwvYmxvb20tZmlsdGVyLmhwcApAQCAtMCwwICsxLDE4MCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBQU3luYy4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIFBTeW5jIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBQU3luYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBQU3luYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBQU3luYywgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKworICogVGhpcyBmaWxlIGluY29ycG9yYXRlcyB3b3JrIGNvdmVyZWQgYnkgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kCisgKiBwZXJtaXNzaW9uIG5vdGljZToKKworICogVGhlIE1JVCBMaWNlbnNlIChNSVQpCisKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBcmFzaCBQYXJ0b3cKKworICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisqLworCisjaWZuZGVmIFBTWU5DX0JMT09NX0ZJTFRFUl9IUFAKKyNkZWZpbmUgUFNZTkNfQkxPT01fRklMVEVSX0hQUAorCisjaW5jbHVkZSA8bmRuLWN4eC9uYW1lLmhwcD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIHBzeW5jIHsKKworc3RydWN0IG9wdGltYWxfcGFyYW1ldGVyc190Cit7CisgIG9wdGltYWxfcGFyYW1ldGVyc190KCkKKyAgOiBudW1iZXJfb2ZfaGFzaGVzKDApLAorICAgIHRhYmxlX3NpemUoMCkKKyAge30KKworICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2hhc2hlczsKKyAgdW5zaWduZWQgaW50IHRhYmxlX3NpemU7Cit9OworCitjbGFzcyBCbG9vbVBhcmFtZXRlcnMKK3sKK3B1YmxpYzoKKyAgQmxvb21QYXJhbWV0ZXJzKCk7CisKKyAgYm9vbAorICBjb21wdXRlX29wdGltYWxfcGFyYW1ldGVycygpOworCisgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QKKyAgeworICAgIHJldHVybiAobWluaW11bV9zaXplID4gbWF4aW11bV9zaXplKSAgICAgIHx8CisgICAgICAgICAgIChtaW5pbXVtX251bWJlcl9vZl9oYXNoZXMgPiBtYXhpbXVtX251bWJlcl9vZl9oYXNoZXMpIHx8CisgICAgICAgICAgIChtaW5pbXVtX251bWJlcl9vZl9oYXNoZXMgPCAxKSAgICAgfHwKKyAgICAgICAgICAgKDAgPT0gbWF4aW11bV9udW1iZXJfb2ZfaGFzaGVzKSAgICB8fAorICAgICAgICAgICAoMCA9PSBwcm9qZWN0ZWRfZWxlbWVudF9jb3VudCkgICAgIHx8CisgICAgICAgICAgIChmYWxzZV9wb3NpdGl2ZV9wcm9iYWJpbGl0eSA8IDAuMCkgfHwKKyAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSA9PSBzdGQ6OmFicyhmYWxzZV9wb3NpdGl2ZV9wcm9iYWJpbGl0eSkpIHx8CisgICAgICAgICAgICgwID09IHJhbmRvbV9zZWVkKSAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgKDB4RkZGRkZGRkZGRkZGRkZGRlVMTCA9PSByYW5kb21fc2VlZCk7CisgIH0KKworICB1bnNpZ25lZCBpbnQgICAgICAgICAgIG1pbmltdW1fc2l6ZTsKKyAgdW5zaWduZWQgaW50ICAgICAgICAgICBtYXhpbXVtX3NpemU7CisgIHVuc2lnbmVkIGludCAgICAgICAgICAgbWluaW11bV9udW1iZXJfb2ZfaGFzaGVzOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgIG1heGltdW1fbnVtYmVyX29mX2hhc2hlczsKKyAgdW5zaWduZWQgaW50ICAgICAgICAgICBwcm9qZWN0ZWRfZWxlbWVudF9jb3VudDsKKyAgZG91YmxlICAgICAgICAgICAgICAgICBmYWxzZV9wb3NpdGl2ZV9wcm9iYWJpbGl0eTsKKyAgdW5zaWduZWQgbG9uZyBsb25nIGludCByYW5kb21fc2VlZDsKKyAgb3B0aW1hbF9wYXJhbWV0ZXJzX3QgICBvcHRpbWFsX3BhcmFtZXRlcnM7Cit9OworCitjbGFzcyBCbG9vbUZpbHRlcgoreworcHJvdGVjdGVkOgorICB0eXBlZGVmIHVpbnQzMl90IGJsb29tX3R5cGU7CisgIHR5cGVkZWYgdWludDhfdCBjZWxsX3R5cGU7CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3IgPGNlbGxfdHlwZT46Oml0ZXJhdG9yIEl0ZXJhdG9yOworCitwdWJsaWM6CisgIGNsYXNzIEVycm9yIDogcHVibGljIHN0ZDo6cnVudGltZV9lcnJvcgorICB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBzdGQ6OnJ1bnRpbWVfZXJyb3I6OnJ1bnRpbWVfZXJyb3I7CisgIH07CisKKyAgQmxvb21GaWx0ZXIoKTsKKworICBleHBsaWNpdCBCbG9vbUZpbHRlcihjb25zdCBCbG9vbVBhcmFtZXRlcnMmIHApOworCisgIEJsb29tRmlsdGVyKHVuc2lnbmVkIGludCBwcm9qZWN0ZWRfZWxlbWVudF9jb3VudCwKKyAgICAgICAgICAgICAgZG91YmxlIGZhbHNlX3Bvc2l0aXZlX3Byb2JhYmlsaXR5KTsKKworICBCbG9vbUZpbHRlcih1bnNpZ25lZCBpbnQgcHJvamVjdGVkX2VsZW1lbnRfY291bnQsCisgICAgICAgICAgICAgIGRvdWJsZSBmYWxzZV9wb3NpdGl2ZV9wcm9iYWJpbGl0eSwKKyAgICAgICAgICAgICAgY29uc3QgbmRuOjpuYW1lOjpDb21wb25lbnQmIGJmTmFtZSk7CisKKyAgQmxvb21QYXJhbWV0ZXJzCisgIGdldFBhcmFtZXRlcnModW5zaWduZWQgaW50IHByb2plY3RlZF9lbGVtZW50X2NvdW50LAorICAgICAgICAgICAgICAgIGRvdWJsZSBmYWxzZV9wb3NpdGl2ZV9wcm9iYWJpbGl0eSk7CisKKyAgLyoqCisgICAqIEBicmllZiBBcHBlbmQgb3VyIGJsb29tIGZpbHRlciB0byB0aGUgZ2l2ZW4gbmFtZQorICAgKgorICAgKiBBcHBlbmQgdGhlIGNvdW50IGFuZCBmYWxzZSBwb3NpdGl2ZSBwcm9iYWJpbGl0eQorICAgKiBhbG9uZyB3aXRoIHRoZSBibG9vbSBmaWx0ZXIgc28gdGhhdCBwcm9kdWNlciAoUGFydGlhbFByb2R1Y2VyKSBjYW4gY29uc3RydWN0IGEgY29weS4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgYXBwZW5kIGJsb29tIGZpbHRlciB0byB0aGlzIG5hbWUKKyAgICovCisgIHZvaWQKKyAgYXBwZW5kVG9OYW1lKG5kbjo6TmFtZSYgbmFtZSkgY29uc3Q7CisKKyAgdm9pZAorICBjbGVhcigpOworCisgIHZvaWQKKyAgaW5zZXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXkpOworCisgIGJvb2wKKyAgY29udGFpbnMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgY29uc3Q7CisKKyAgc3RkOjp2ZWN0b3I8Y2VsbF90eXBlPgorICB0YWJsZSgpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkCisgIGdlbmVyYXRlX3VuaXF1ZV9zYWx0KCk7CisKKyAgdm9pZAorICBjb21wdXRlX2luZGljZXMoY29uc3QgYmxvb21fdHlwZSYgaGFzaCwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90JiBiaXRfaW5kZXgsIHN0ZDo6c2l6ZV90JiBiaXQpIGNvbnN0OworCitwcml2YXRlOgorICBzdGQ6OnZlY3RvciA8Ymxvb21fdHlwZT4gc2FsdF87CisgIHN0ZDo6dmVjdG9yIDxjZWxsX3R5cGU+ICBiaXRfdGFibGVfOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgc2FsdF9jb3VudF87CisgIHVuc2lnbmVkIGludCAgICAgICAgICAgICB0YWJsZV9zaXplXzsgLy8gOCAqIHJhd190YWJsZV9zaXplOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgcmF3X3RhYmxlX3NpemVfOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgcHJvamVjdGVkX2VsZW1lbnRfY291bnRfOworICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgaW5zZXJ0ZWRfZWxlbWVudF9jb3VudF87CisgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgICByYW5kb21fc2VlZF87CisgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBkZXNpcmVkX2ZhbHNlX3Bvc2l0aXZlX3Byb2JhYmlsaXR5XzsKK307CisKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgQmxvb21GaWx0ZXImIGJmMSwgY29uc3QgQmxvb21GaWx0ZXImIGJmMik7CisKK3N0ZDo6b3N0cmVhbSYKK29wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IEJsb29tRmlsdGVyJiBiZik7CisKK30gLy8gbmFtZXNwYWNlIHBzeW5jCisKKyNlbmRpZiAvLyBQU1lOQ19CTE9PTV9GSUxURVJfSFBQClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2RldGFpbC9pYmx0LmNwcCBiL3NyYy9kZXRhaWwvaWJsdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1YzIzMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9kZXRhaWwvaWJsdC5jcHAKQEAgLTAsMCArMSwyNzcgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgUFN5bmMuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBQU3luYyBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogUFN5bmMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogUFN5bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogUFN5bmMsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisKKyAqIFRoaXMgZmlsZSBpbmNvcnBvcmF0ZXMgd29yayBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZAorICogcGVybWlzc2lvbiBub3RpY2U6CisKKyAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKQorCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgR2F2aW4gQW5kcmVzZW4KKworICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisqLworCisjaW5jbHVkZSAiaWJsdC5ocHAiCisjaW5jbHVkZSAidXRpbC5ocHAiCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgcHN5bmMgeworCitjb25zdCBzaXplX3QgTl9IQVNIKDMpOworY29uc3Qgc2l6ZV90IE5fSEFTSENIRUNLKDExKTsKKworYm9vbAorSGFzaFRhYmxlRW50cnk6OmlzUHVyZSgpIGNvbnN0Cit7CisgIGlmIChjb3VudCA9PSAxIHx8IGNvdW50ID09IC0xKSB7CisgICAgdWludDMyX3QgY2hlY2sgPSBtdXJtdXJIYXNoMyhOX0hBU0hDSEVDSywga2V5U3VtKTsKKyAgICByZXR1cm4ga2V5Q2hlY2sgPT0gY2hlY2s7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wKK0hhc2hUYWJsZUVudHJ5Ojppc0VtcHR5KCkgY29uc3QKK3sKKyAgcmV0dXJuIGNvdW50ID09IDAgJiYga2V5U3VtID09IDAgJiYga2V5Q2hlY2sgPT0gMDsKK30KKworSUJMVDo6SUJMVChzaXplX3QgZXhwZWN0ZWROdW1FbnRyaWVzKQoreworICAvLyAxLjV4IGV4cGVjdGVkTnVtRW50cmllcyBnaXZlcyB2ZXJ5IGxvdyBwcm9iYWJpbGl0eSBvZiBkZWNvZGluZyBmYWlsdXJlCisgIHNpemVfdCBuRW50cmllcyA9IGV4cGVjdGVkTnVtRW50cmllcyArIGV4cGVjdGVkTnVtRW50cmllcyAvIDI7CisgIC8vIG1ha2UgbkVudHJpZXMgZXhhY3RseSBkaXZpc2libGUgYnkgTl9IQVNICisgIHNpemVfdCByZW1haW5kZXIgPSBuRW50cmllcyAlIE5fSEFTSDsKKyAgaWYgKHJlbWFpbmRlciAhPSAwKSB7CisgICAgbkVudHJpZXMgKz0gKE5fSEFTSCAtIHJlbWFpbmRlcik7CisgIH0KKworICBtX2hhc2hUYWJsZS5yZXNpemUobkVudHJpZXMpOworfQorCit2b2lkCitJQkxUOjppbml0aWFsaXplKGNvbnN0IG5kbjo6bmFtZTo6Q29tcG9uZW50JiBpYmx0TmFtZSkKK3sKKyAgY29uc3QgYXV0byYgdmFsdWVzID0gZXh0cmFjdFZhbHVlRnJvbU5hbWUoaWJsdE5hbWUpOworCisgIGlmICgzICogbV9oYXNoVGFibGUuc2l6ZSgpICE9IHZhbHVlcy5zaXplKCkpIHsKKyAgICBCT09TVF9USFJPV19FWENFUFRJT04oRXJyb3IoIlJlY2VpdmVkIElCRiBjYW5ub3QgYmUgZGVjb2RlZCEiKSk7CisgIH0KKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1faGFzaFRhYmxlLnNpemUoKTsgaSsrKSB7CisgICAgSGFzaFRhYmxlRW50cnkmIGVudHJ5ID0gbV9oYXNoVGFibGUuYXQoaSk7CisgICAgaWYgKHZhbHVlc1tpICogM10gIT0gMCkgeworICAgICAgZW50cnkuY291bnQgPSB2YWx1ZXNbaSAqIDNdOworICAgICAgZW50cnkua2V5U3VtID0gdmFsdWVzWyhpICogMykgKyAxXTsKKyAgICAgIGVudHJ5LmtleUNoZWNrID0gdmFsdWVzWyhpICogMykgKyAyXTsKKyAgICB9CisgIH0KK30KKwordm9pZAorSUJMVDo6dXBkYXRlKGludCBwbHVzT3JNaW51cywgdWludDMyX3Qga2V5KQoreworICBzaXplX3QgYnVja2V0c1Blckhhc2ggPSBtX2hhc2hUYWJsZS5zaXplKCkgLyBOX0hBU0g7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOX0hBU0g7IGkrKykgeworICAgIHNpemVfdCBzdGFydEVudHJ5ID0gaSAqIGJ1Y2tldHNQZXJIYXNoOworICAgIHVpbnQzMl90IGggPSBtdXJtdXJIYXNoMyhpLCBrZXkpOworICAgIEhhc2hUYWJsZUVudHJ5JiBlbnRyeSA9IG1faGFzaFRhYmxlLmF0KHN0YXJ0RW50cnkgKyAoaCAlIGJ1Y2tldHNQZXJIYXNoKSk7CisgICAgZW50cnkuY291bnQgKz0gcGx1c09yTWludXM7CisgICAgZW50cnkua2V5U3VtIF49IGtleTsKKyAgICBlbnRyeS5rZXlDaGVjayBePSBtdXJtdXJIYXNoMyhOX0hBU0hDSEVDSywga2V5KTsKKyAgfQorfQorCit2b2lkCitJQkxUOjppbnNlcnQodWludDMyX3Qga2V5KQoreworICB1cGRhdGUoSU5TRVJULCBrZXkpOworfQorCit2b2lkCitJQkxUOjplcmFzZSh1aW50MzJfdCBrZXkpCit7CisgIHVwZGF0ZShFUkFTRSwga2V5KTsKK30KKworYm9vbAorSUJMVDo6bGlzdEVudHJpZXMoc3RkOjpzZXQ8dWludDMyX3Q+JiBwb3NpdGl2ZSwgc3RkOjpzZXQ8dWludDMyX3Q+JiBuZWdhdGl2ZSkgY29uc3QKK3sKKyAgSUJMVCBwZWVsZWQgPSAqdGhpczsKKworICBzaXplX3QgbkVyYXNlZCA9IDA7CisgIGRvIHsKKyAgICBuRXJhc2VkID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogcGVlbGVkLm1faGFzaFRhYmxlKSB7CisgICAgICBpZiAoZW50cnkuaXNQdXJlKCkpIHsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgICBwb3NpdGl2ZS5pbnNlcnQoZW50cnkua2V5U3VtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBuZWdhdGl2ZS5pbnNlcnQoZW50cnkua2V5U3VtKTsKKyAgICAgICAgfQorICAgICAgICBwZWVsZWQudXBkYXRlKC1lbnRyeS5jb3VudCwgZW50cnkua2V5U3VtKTsKKyAgICAgICAgKytuRXJhc2VkOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAobkVyYXNlZCA+IDApOworCisgIC8vIElmIGFueSBidWNrZXRzIGZvciBvbmUgb2YgdGhlIGhhc2ggZnVuY3Rpb25zIGlzIG5vdCBlbXB0eSwKKyAgLy8gdGhlbiB3ZSBkaWRuJ3QgcGVlbCB0aGVtIGFsbDoKKyAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IHBlZWxlZC5tX2hhc2hUYWJsZSkgeworICAgIGlmIChlbnRyeS5pc0VtcHR5KCkgIT0gdHJ1ZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitJQkxUCitJQkxUOjpvcGVyYXRvci0oY29uc3QgSUJMVCYgb3RoZXIpIGNvbnN0Cit7CisgIEJPT1NUX0FTU0VSVChtX2hhc2hUYWJsZS5zaXplKCkgPT0gb3RoZXIubV9oYXNoVGFibGUuc2l6ZSgpKTsKKworICBJQkxUIHJlc3VsdCgqdGhpcyk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9oYXNoVGFibGUuc2l6ZSgpOyBpKyspIHsKKyAgICBIYXNoVGFibGVFbnRyeSYgZTEgPSByZXN1bHQubV9oYXNoVGFibGUuYXQoaSk7CisgICAgY29uc3QgSGFzaFRhYmxlRW50cnkmIGUyID0gb3RoZXIubV9oYXNoVGFibGUuYXQoaSk7CisgICAgZTEuY291bnQgLT0gZTIuY291bnQ7CisgICAgZTEua2V5U3VtIF49IGUyLmtleVN1bTsKKyAgICBlMS5rZXlDaGVjayBePSBlMi5rZXlDaGVjazsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wKK29wZXJhdG9yPT0oY29uc3QgSUJMVCYgaWJsdDEsIGNvbnN0IElCTFQmIGlibHQyKQoreworICBhdXRvIGlibHQxSGFzaFRhYmxlID0gaWJsdDEuZ2V0SGFzaFRhYmxlKCk7CisgIGF1dG8gaWJsdDJIYXNoVGFibGUgPSBpYmx0Mi5nZXRIYXNoVGFibGUoKTsKKyAgaWYgKGlibHQxSGFzaFRhYmxlLnNpemUoKSAhPSBpYmx0Mkhhc2hUYWJsZS5zaXplKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzaXplX3QgTiA9IGlibHQxSGFzaFRhYmxlLnNpemUoKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE47IGkrKykgeworICAgIGlmIChpYmx0MUhhc2hUYWJsZVtpXS5jb3VudCAhPSBpYmx0Mkhhc2hUYWJsZVtpXS5jb3VudCB8fAorICAgICAgICBpYmx0MUhhc2hUYWJsZVtpXS5rZXlTdW0gIT0gaWJsdDJIYXNoVGFibGVbaV0ua2V5U3VtIHx8CisgICAgICAgIGlibHQxSGFzaFRhYmxlW2ldLmtleUNoZWNrICE9IGlibHQySGFzaFRhYmxlW2ldLmtleUNoZWNrKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgSUJMVCYgaWJsdDEsIGNvbnN0IElCTFQmIGlibHQyKQoreworICByZXR1cm4gIShpYmx0MSA9PSBpYmx0Mik7Cit9CisKK3N0ZDo6b3N0cmVhbSYKK29wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IElCTFQmIGlibHQpCit7CisgIG91dCA8PCAiY291bnQga2V5U3VtIGtleUNoZWNrTWF0Y2hcbiI7CisgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBpYmx0LmdldEhhc2hUYWJsZSgpKSB7CisgICAgb3V0IDw8IGVudHJ5LmNvdW50IDw8ICIgIiA8PCBlbnRyeS5rZXlTdW0gPDwgIiAiOworICAgIG91dCA8PCAoKG11cm11ckhhc2gzKE5fSEFTSENIRUNLLCBlbnRyeS5rZXlTdW0pID09IGVudHJ5LmtleUNoZWNrKSB8fAorICAgICAgICAgICAoZW50cnkuaXNFbXB0eSgpKT8gInRydWUiIDogImZhbHNlIik7CisgICAgb3V0IDw8ICJcbiI7CisgIH0KKworICByZXR1cm4gb3V0OworfQorCit2b2lkCitJQkxUOjphcHBlbmRUb05hbWUobmRuOjpOYW1lJiBuYW1lKSBjb25zdAoreworICBzaXplX3QgbiA9IG1faGFzaFRhYmxlLnNpemUoKTsKKyAgc2l6ZV90IHVuaXRTaXplID0gKDMyICogMykgLyA4OyAvLyBoYXJkIGNvZGluZworICBzaXplX3QgdGFibGVTaXplID0gdW5pdFNpemUgKiBuOworCisgIHN0ZDo6dmVjdG9yIDx1aW50OF90PiB0YWJsZSh0YWJsZVNpemUpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgLy8gdGFibGVbaSoxMl0sICAgdGFibGVbaSoxMisxXSwgdGFibGVbaSoxMisyXSwgdGFibGVbaSoxMiszXSAtLT4gaGFzaFRhYmxlW2ldLmNvdW50CisKKyAgICB0YWJsZVsoaSAqIHVuaXRTaXplKV0gICA9IDB4RkYgJiBtX2hhc2hUYWJsZVtpXS5jb3VudDsKKyAgICB0YWJsZVsoaSAqIHVuaXRTaXplKSArIDFdID0gMHhGRiAmIChtX2hhc2hUYWJsZVtpXS5jb3VudCA+PiA4KTsKKyAgICB0YWJsZVsoaSAqIHVuaXRTaXplKSArIDJdID0gMHhGRiAmIChtX2hhc2hUYWJsZVtpXS5jb3VudCA+PiAxNik7CisgICAgdGFibGVbKGkgKiB1bml0U2l6ZSkgKyAzXSA9IDB4RkYgJiAobV9oYXNoVGFibGVbaV0uY291bnQgPj4gMjQpOworCisgICAgLy8gdGFibGVbaSoxMis0XSwgdGFibGVbaSoxMis1XSwgdGFibGVbaSoxMis2XSwgdGFibGVbaSoxMis3XSAtLT4gaGFzaFRhYmxlW2ldLmtleVN1bQorCisgICAgdGFibGVbKGkgKiB1bml0U2l6ZSkgKyA0XSA9IDB4RkYgJiBtX2hhc2hUYWJsZVtpXS5rZXlTdW07CisgICAgdGFibGVbKGkgKiB1bml0U2l6ZSkgKyA1XSA9IDB4RkYgJiAobV9oYXNoVGFibGVbaV0ua2V5U3VtID4+IDgpOworICAgIHRhYmxlWyhpICogdW5pdFNpemUpICsgNl0gPSAweEZGICYgKG1faGFzaFRhYmxlW2ldLmtleVN1bSA+PiAxNik7CisgICAgdGFibGVbKGkgKiB1bml0U2l6ZSkgKyA3XSA9IDB4RkYgJiAobV9oYXNoVGFibGVbaV0ua2V5U3VtID4+IDI0KTsKKworICAgIC8vIHRhYmxlW2kqMTIrOF0sIHRhYmxlW2kqMTIrOV0sIHRhYmxlW2kqMTIrMTBdLCB0YWJsZVtpKjEyKzExXSAtLT4gaGFzaFRhYmxlW2ldLmtleUNoZWNrCisKKyAgICB0YWJsZVsoaSAqIHVuaXRTaXplKSArIDhdID0gMHhGRiAmIG1faGFzaFRhYmxlW2ldLmtleUNoZWNrOworICAgIHRhYmxlWyhpICogdW5pdFNpemUpICsgOV0gPSAweEZGICYgKG1faGFzaFRhYmxlW2ldLmtleUNoZWNrID4+IDgpOworICAgIHRhYmxlWyhpICogdW5pdFNpemUpICsgMTBdID0gMHhGRiAmIChtX2hhc2hUYWJsZVtpXS5rZXlDaGVjayA+PiAxNik7CisgICAgdGFibGVbKGkgKiB1bml0U2l6ZSkgKyAxMV0gPSAweEZGICYgKG1faGFzaFRhYmxlW2ldLmtleUNoZWNrID4+IDI0KTsKKyAgfQorCisgIG5hbWUuYXBwZW5kKHRhYmxlLmJlZ2luKCksIHRhYmxlLmVuZCgpKTsKK30KKworc3RkOjp2ZWN0b3I8dWludDMyX3Q+CitJQkxUOjpleHRyYWN0VmFsdWVGcm9tTmFtZShjb25zdCBuZG46Om5hbWU6OkNvbXBvbmVudCYgaWJsdE5hbWUpIGNvbnN0Cit7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGlibHRWYWx1ZXMoaWJsdE5hbWUudmFsdWVfYmVnaW4oKSwgaWJsdE5hbWUudmFsdWVfZW5kKCkpOworICBzaXplX3QgbiA9IGlibHRWYWx1ZXMuc2l6ZSgpIC8gNDsKKworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gdmFsdWVzKG4sIDApOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNCAqIG47IGkgKz0gNCkgeworICAgIHVpbnQzMl90IHQgPSAoaWJsdFZhbHVlc1tpICsgM10gPDwgMjQpICsKKyAgICAgICAgICAgICAgICAgKGlibHRWYWx1ZXNbaSArIDJdIDw8IDE2KSArCisgICAgICAgICAgICAgICAgIChpYmx0VmFsdWVzW2kgKyAxXSA8PCA4KSAgKworICAgICAgICAgICAgICAgICBpYmx0VmFsdWVzW2ldOworICAgIHZhbHVlc1tpIC8gNF0gPSB0OworICB9CisKKyAgcmV0dXJuIHZhbHVlczsKK30KKworfSAvLyBuYW1lc3BhY2UgcHN5bmMKZGlmZiAtLWdpdCBhL3NyYy9kZXRhaWwvaWJsdC5ocHAgYi9zcmMvZGV0YWlsL2libHQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzc5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZGV0YWlsL2libHQuaHBwCkBAIC0wLDAgKzEsMTgxIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFBTeW5jLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgUFN5bmMgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIFBTeW5jIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFBTeW5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIFBTeW5jLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorCisgKiBUaGlzIGZpbGUgaW5jb3Jwb3JhdGVzIHdvcmsgY292ZXJlZCBieSB0aGUgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQKKyAqIHBlcm1pc3Npb24gbm90aWNlOgorCisgKiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKKworICogQ29weXJpZ2h0IChjKSAyMDE0IEdhdmluIEFuZHJlc2VuCisKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorKi8KKworI2lmbmRlZiBQU1lOQ19JQkxUX0hQUAorI2RlZmluZSBQU1lOQ19JQkxUX0hQUAorCisjaW5jbHVkZSA8bmRuLWN4eC9uYW1lLmhwcD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBwc3luYyB7CisKK2NsYXNzIEhhc2hUYWJsZUVudHJ5Cit7CitwdWJsaWM6CisgIGludDMyX3QgY291bnQ7CisgIHVpbnQzMl90IGtleVN1bTsKKyAgdWludDMyX3Qga2V5Q2hlY2s7CisKKyAgYm9vbAorICBpc1B1cmUoKSBjb25zdDsKKworICBib29sCisgIGlzRW1wdHkoKSBjb25zdDsKK307CisKK2V4dGVybiBjb25zdCBzaXplX3QgTl9IQVNIOworZXh0ZXJuIGNvbnN0IHNpemVfdCBOX0hBU0hDSEVDSzsKKworLyoqCisgKiBAYnJpZWYgSW52ZXJ0aWJsZSBCbG9vbSBMb29rdXAgVGFibGUgKEludmVydGlibGUgQmxvb20gRmlsdGVyKQorICoKKyAqIFVzZWQgYnkgUGFydGlhbCBTeW5jIChQYXJ0aWFsUHJvZHVjZXIpIGFuZCBGdWxsIFN5bmMgKEZ1bGwgUHJvZHVjZXIpCisgKi8KK2NsYXNzIElCTFQKK3sKK3B1YmxpYzoKKyAgY2xhc3MgRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIHN0ZDo6cnVudGltZV9lcnJvcjo6cnVudGltZV9lcnJvcjsKKyAgfTsKKworICAvKioKKyAgICogQGJyaWVmIGNvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBleHBlY3RlZE51bUVudHJpZXMgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBJQkxUCisgICAqLworICBleHBsaWNpdCBJQkxUKHNpemVfdCBleHBlY3RlZE51bUVudHJpZXMpOworCisgIC8qKgorICAgKiBAYnJpZWYgUG9wdWxhdGUgdGhlIGhhc2ggdGFibGUgdXNpbmcgdGhlIHZlY3RvciByZXByZXNlbnRhdGlvbiBvZiBJQkxUCisgICAqCisgICAqIEBwYXJhbSBpYmx0TmFtZSB0aGUgQ29tcG9uZW50IHJlcHJlc2VudGF0aW9uIG9mIElCTFQKKyAgICogQHRocm93cyBFcnJvciBpZiBzaXplIG9mIHZhbHVlcyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgSUJGCisgICAqLworICB2b2lkCisgIGluaXRpYWxpemUoY29uc3QgbmRuOjpuYW1lOjpDb21wb25lbnQmIGlibHROYW1lKTsKKworICB2b2lkCisgIGluc2VydCh1aW50MzJfdCBrZXkpOworCisgIHZvaWQKKyAgZXJhc2UodWludDMyX3Qga2V5KTsKKworICAvKioKKyAgICogQGJyaWVmIExpc3QgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBJQkxUCisgICAqCisgICAqIFRoaXMgaXMgY2FsbGVkIG9uIGEgZGlmZmVyZW5jZSBvZiB0d28gSUJMVHM6IG93bklCTFQgLSByY3ZkSUJMVAorICAgKiBFbnRyaWVzIGxpc3RlZCBpbiBwb3NpdGl2ZSBhcmUgaW4gb3duSUJMVCBidXQgbm90IGluIHJjdmRJQkxUCisgICAqIEVudHJpZXMgbGlzdGVkIGluIG5lZ2F0aXZlIGFyZSBpbiByY3ZkSUJMVCBidXQgbm90IGluIG93bklCTFQKKyAgICoKKyAgICogQHBhcmFtIHBvc2l0aXZlCisgICAqIEBwYXJhbSBuZWdhdGl2ZQorICAgKiBAcmV0dXJuIHRydWUgaWYgZGVjb2RpbmcgaXMgY29tcGxldGUgc3VjY2Vzc2Z1bGx5CisgICAqLworICBib29sCisgIGxpc3RFbnRyaWVzKHN0ZDo6c2V0PHVpbnQzMl90PiYgcG9zaXRpdmUsIHN0ZDo6c2V0PHVpbnQzMl90PiYgbmVnYXRpdmUpIGNvbnN0OworCisgIElCTFQKKyAgb3BlcmF0b3ItKGNvbnN0IElCTFQmIG90aGVyKSBjb25zdDsKKworICBzdGQ6OnZlY3RvcjxIYXNoVGFibGVFbnRyeT4KKyAgZ2V0SGFzaFRhYmxlKCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2hhc2hUYWJsZTsKKyAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgQXBwZW5kcyBzZWxmIHRvIG5hbWUKKyAgICoKKyAgICogRW5jb2RlcyBvdXIgaGFzaCB0YWJsZSBmcm9tIHVpbnQzMl90IHZlY3RvciB0byB1aW50OF90IHZlY3RvcgorICAgKiBXZSBjcmVhdGUgYSB1aW44X3QgdmVjdG9yIDEyIHRpbWVzIHRoZSBzaXplIG9mIHVpbnQzMl90IHZlY3RvcgorICAgKiBXZSBwdXQgdGhlIGZpcnN0IGNvdW50IGluIGZpcnN0IDQgY2VsbHMsIGtleVN1bSBpbiBuZXh0IDQsIGFuZCBrZXlDaGVjayBpbiBuZXh0IDQuCisgICAqIFJlcGVhdCBmb3IgYWxsIHRoZSBvdGhlciBjZWxscyBvZiB0aGUgaGFzaCB0YWJsZS4KKyAgICogVGhlbiB3ZSBhcHBlbmQgdGhpcyB1aW50OF90IHZlY3RvciB0byB0aGUgbmFtZS4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUKKyAgICovCisgIHZvaWQKKyAgYXBwZW5kVG9OYW1lKG5kbjo6TmFtZSYgbmFtZSkgY29uc3Q7CisKKyAgLyoqCisgICAqIEBicmllZiBFeHRyYWN0cyBJQkxUIGZyb20gbmFtZSBjb21wb25lbnQKKyAgICoKKyAgICogQ29udmVydHMgdGhlIG5hbWUgaW50byBhIHVpbnQ4X3QgdmVjdG9yIHdoaWNoIGlzIHRoZW4gZGVjb2RlZCB0byBhCisgICAqIGEgdWludDMyX3QgdmVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gaWJsdE5hbWUgSUJMVCByZXByZXNlbnRlZCBhcyBhIE5hbWUgQ29tcG9uZW50CisgICAqIEByZXR1cm4gYSB1aW50MzJfdCB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBoYXNoIHRhYmxlIG9mIHRoZSBJQkxUCisgICAqLworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4KKyAgZXh0cmFjdFZhbHVlRnJvbU5hbWUoY29uc3QgbmRuOjpuYW1lOjpDb21wb25lbnQmIGlibHROYW1lKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdm9pZAorICB1cGRhdGUoaW50IHBsdXNPck1pbnVzLCB1aW50MzJfdCBrZXkpOworCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxIYXNoVGFibGVFbnRyeT4gbV9oYXNoVGFibGU7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5TRVJUID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBFUkFTRSA9IC0xOworfTsKKworYm9vbAorb3BlcmF0b3I9PShjb25zdCBJQkxUJiBpYmx0MSwgY29uc3QgSUJMVCYgaWJsdDIpOworCitib29sCitvcGVyYXRvciE9KGNvbnN0IElCTFQmIGlibHQxLCBjb25zdCBJQkxUJiBpYmx0Mik7CisKK3N0ZDo6b3N0cmVhbSYKK29wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IElCTFQmIGlibHQpOworCit9IC8vIG5hbWVzcGFjZSBwc3luYworCisjZW5kaWYgLy8gUFNZTkNfSUJMVF9IUFAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvZGV0YWlsL3N0YXRlLmNwcCBiL3NyYy9kZXRhaWwvc3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzZjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZGV0YWlsL3N0YXRlLmNwcApAQCAtMCwwICsxLDExMyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBQU3luYy4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIFBTeW5jIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBQU3luYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBQU3luYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBQU3luYywgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaW5jbHVkZSAic3RhdGUuaHBwIgorCituYW1lc3BhY2UgcHN5bmMgeworCitTdGF0ZTo6U3RhdGUoY29uc3QgbmRuOjpCbG9jayYgYmxvY2spCit7CisgIHdpcmVEZWNvZGUoYmxvY2spOworfQorCit2b2lkCitTdGF0ZTo6YWRkQ29udGVudChjb25zdCBuZG46Ok5hbWUmIHByZWZpeCkKK3sKKyAgbV9jb250ZW50LmVtcGxhY2VfYmFjayhwcmVmaXgpOworfQorCitjb25zdCBuZG46OkJsb2NrJgorU3RhdGU6OndpcmVFbmNvZGUoKSBjb25zdAoreworICBpZiAobV93aXJlLmhhc1dpcmUoKSkgeworICAgIHJldHVybiBtX3dpcmU7CisgIH0KKworICBuZG46OkVuY29kaW5nRXN0aW1hdG9yIGVzdGltYXRvcjsKKyAgc2l6ZV90IGVzdGltYXRlZFNpemUgPSB3aXJlRW5jb2RlKGVzdGltYXRvcik7CisKKyAgbmRuOjpFbmNvZGluZ0J1ZmZlciBidWZmZXIoZXN0aW1hdGVkU2l6ZSwgMCk7CisgIHdpcmVFbmNvZGUoYnVmZmVyKTsKKworICBtX3dpcmUgPSBidWZmZXIuYmxvY2soKTsKKyAgcmV0dXJuIG1fd2lyZTsKK30KKwordGVtcGxhdGU8bmRuOjplbmNvZGluZzo6VGFnIFRBRz4KK3NpemVfdAorU3RhdGU6OndpcmVFbmNvZGUobmRuOjpFbmNvZGluZ0ltcGw8VEFHPiYgYmxvY2spIGNvbnN0Cit7CisgIHNpemVfdCB0b3RhbExlbmd0aCA9IDA7CisKKyAgZm9yIChzdGQ6OnZlY3RvcjxuZG46Ok5hbWU+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gbV9jb250ZW50LnJiZWdpbigpOworICAgIGl0ICE9IG1fY29udGVudC5yZW5kKCk7ICsraXQpIHsKKyAgICB0b3RhbExlbmd0aCArPSBpdC0+d2lyZUVuY29kZShibG9jayk7CisgIH0KKworICB0b3RhbExlbmd0aCArPSBibG9jay5wcmVwZW5kVmFyTnVtYmVyKHRvdGFsTGVuZ3RoKTsKKyAgdG90YWxMZW5ndGggKz0gYmxvY2sucHJlcGVuZFZhck51bWJlcih0bHY6OlBTeW5jQ29udGVudCk7CisKKyAgcmV0dXJuIHRvdGFsTGVuZ3RoOworfQorCitORE5fQ1hYX0RFRklORV9XSVJFX0VOQ09ERV9JTlNUQU5USUFUSU9OUyhTdGF0ZSk7CisKK3ZvaWQKK1N0YXRlOjp3aXJlRGVjb2RlKGNvbnN0IG5kbjo6QmxvY2smIHdpcmUpCit7CisgIGlmICghd2lyZS5oYXNXaXJlKCkpIHsKKyAgICBCT09TVF9USFJPV19FWENFUFRJT04obmRuOjp0bHY6OkVycm9yKCJUaGUgc3VwcGxpZWQgYmxvY2sgZG9lcyBub3QgY29udGFpbiB3aXJlIGZvcm1hdCIpKTsKKyAgfQorCisgIHdpcmUucGFyc2UoKTsKKyAgbV93aXJlID0gd2lyZTsKKworICBhdXRvIGl0ID0gbV93aXJlLmVsZW1lbnRzX2JlZ2luKCk7CisKKyAgaWYgKGl0LT50eXBlKCkgIT0gdGx2OjpQU3luY0NvbnRlbnQpIHsKKyAgICBCT09TVF9USFJPV19FWENFUFRJT04obmRuOjp0bHY6OkVycm9yKCJVbmV4cGVjdGVkIFRMViB0eXBlIHdoZW4gZGVjb2RpbmcgQ29udGVudDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnRvX3N0cmluZyh3aXJlLnR5cGUoKSkpKTsKKyAgfQorCisgIGl0LT5wYXJzZSgpOworCisgIGZvciAoYXV0byB2YWwgPSBpdC0+ZWxlbWVudHNfYmVnaW4oKTsgdmFsICE9IGl0LT5lbGVtZW50c19lbmQoKTsgKyt2YWwpIHsKKyAgICBpZiAodmFsLT50eXBlKCkgPT0gbmRuOjp0bHY6Ok5hbWUpIHsKKyAgICAgIG1fY29udGVudC5lbXBsYWNlX2JhY2soKnZhbCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgQk9PU1RfVEhST1dfRVhDRVBUSU9OKG5kbjo6dGx2OjpFcnJvcigiRXhwZWN0ZWQgTmFtZSBCbG9jaywgYnV0IEJsb2NrIGlzIG9mIGEgZGlmZmVyZW50IHR5cGU6ICMiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuOjp0b19zdHJpbmcobV93aXJlLnR5cGUoKSkpKTsKKyAgICB9CisgIH0KK30KKworc3RkOjpvc3RyZWFtJgorb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBTdGF0ZSYgc3RhdGUpCit7CisgIHN0ZDo6dmVjdG9yPG5kbjo6TmFtZT4gY29udGVudCA9IHN0YXRlLmdldENvbnRlbnQoKTsKKworICBvcyA8PCAiWyI7CisgIHN0ZDo6Y29weShjb250ZW50LmJlZ2luKCksIGNvbnRlbnQuZW5kKCksIG5kbjo6bWFrZV9vc3RyZWFtX2pvaW5lcihvcywgIiwgIikpOworICBvcyA8PCAiXSI7CisKKyAgcmV0dXJuIG9zOworfQorCit9IC8vIG5hbWVzcGFjZSBwc3luYwpkaWZmIC0tZ2l0IGEvc3JjL2RldGFpbC9zdGF0ZS5ocHAgYi9zcmMvZGV0YWlsL3N0YXRlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM2MDg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2RldGFpbC9zdGF0ZS5ocHAKQEAgLTAsMCArMSw3MyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBQU3luYy4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIFBTeW5jIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBQU3luYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBQU3luYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBQU3luYywgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaWZuZGVmIFBTWU5DX1NUQVRFX0hQUAorI2RlZmluZSBQU1lOQ19TVEFURV9IUFAKKworI2luY2x1ZGUgPG5kbi1jeHgvbmFtZS5ocHA+CisKK25hbWVzcGFjZSBwc3luYyB7CisKK25hbWVzcGFjZSB0bHYgeworCitlbnVtIHsKKyAgUFN5bmNDb250ZW50ID0gMTI4Cit9OworCit9IC8vIG5hbWVzcGFjZSB0bHYKKworY2xhc3MgU3RhdGUKK3sKK3B1YmxpYzoKKyAgZXhwbGljaXQgU3RhdGUoY29uc3QgbmRuOjpCbG9jayYgYmxvY2spOworCisgIFN0YXRlKCkgPSBkZWZhdWx0OworCisgIHZvaWQKKyAgYWRkQ29udGVudChjb25zdCBuZG46Ok5hbWUmIHByZWZpeCk7CisKKyAgc3RkOjp2ZWN0b3I8bmRuOjpOYW1lPgorICBnZXRDb250ZW50KCkgY29uc3QKKyAgeworICAgIHJldHVybiBtX2NvbnRlbnQ7CisgIH0KKworICBjb25zdCBuZG46OkJsb2NrJgorICB3aXJlRW5jb2RlKCkgY29uc3Q7CisKKyAgdGVtcGxhdGU8bmRuOjplbmNvZGluZzo6VGFnIFRBRz4KKyAgc2l6ZV90CisgIHdpcmVFbmNvZGUobmRuOjpFbmNvZGluZ0ltcGw8VEFHPiYgYmxvY2spIGNvbnN0OworCisgIHZvaWQKKyAgd2lyZURlY29kZShjb25zdCBuZG46OkJsb2NrJiB3aXJlKTsKKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8bmRuOjpOYW1lPiBtX2NvbnRlbnQ7CisgIG11dGFibGUgbmRuOjpCbG9jayBtX3dpcmU7Cit9OworCitORE5fQ1hYX0RFQ0xBUkVfV0lSRV9FTkNPREVfSU5TVEFOVElBVElPTlMoU3RhdGUpOworCitzdGQ6Om9zdHJlYW0mCitvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFN0YXRlJiBTdGF0ZSk7CisKK30gLy8gbmFtZXNwYWNlIHBzeW5jCisKKyNlbmRpZiAvLyBQU1lOQ19TVEFURV9IUFAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvZGV0YWlsL3Rlc3QtYWNjZXNzLWNvbnRyb2wuaHBwIGIvc3JjL2RldGFpbC90ZXN0LWFjY2Vzcy1jb250cm9sLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjUzYTdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2RldGFpbC90ZXN0LWFjY2Vzcy1jb250cm9sLmhwcApAQCAtMCwwICsxLDM5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFBTeW5jLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgUFN5bmMgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIFBTeW5jIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFBTeW5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIFBTeW5jLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4KKyAqCisgKiovCisKKyNpZm5kZWYgUFNZTkNfVEVTVF9BQ0NFU1NfQ09OVFJPTF9IUFAKKyNkZWZpbmUgUFNZTkNfVEVTVF9BQ0NFU1NfQ09OVFJPTF9IUFAKKworI2luY2x1ZGUgInBzeW5jLWNvbmZpZy5ocHAiCisKKyNpZmRlZiBXSVRIX1RFU1RTCisjZGVmaW5lIFZJUlRVQUxfV0lUSF9URVNUUyB2aXJ0dWFsCisjZGVmaW5lIFBVQkxJQ19XSVRIX1RFU1RTX0VMU0VfUFJPVEVDVEVEIHB1YmxpYworI2RlZmluZSBQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BSSVZBVEUgcHVibGljCisjZGVmaW5lIFBST1RFQ1RFRF9XSVRIX1RFU1RTX0VMU0VfUFJJVkFURSBwcm90ZWN0ZWQKKyNlbHNlCisjZGVmaW5lIFZJUlRVQUxfV0lUSF9URVNUUworI2RlZmluZSBQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BST1RFQ1RFRCBwcm90ZWN0ZWQKKyNkZWZpbmUgUFVCTElDX1dJVEhfVEVTVFNfRUxTRV9QUklWQVRFIHByaXZhdGUKKyNkZWZpbmUgUFJPVEVDVEVEX1dJVEhfVEVTVFNfRUxTRV9QUklWQVRFIHByaXZhdGUKKyNlbmRpZgorCisjZW5kaWYgLy8gUFNZTkNfVEVTVF9BQ0NFU1NfQ09OVFJPTF9IUFAKZGlmZiAtLWdpdCBhL3NyYy9kZXRhaWwvdXRpbC5jcHAgYi9zcmMvZGV0YWlsL3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMmM1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZGV0YWlsL3V0aWwuY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFBTeW5jLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgUFN5bmMgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIFBTeW5jIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFBTeW5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIFBTeW5jLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogbXVybXVySGFzaDMgd2FzIHdyaXR0ZW4gYnkgQXVzdGluIEFwcGxlYnksIGFuZCBpcyBwbGFjZWQgaW4gdGhlIHB1YmxpYworICogZG9tYWluLiBUaGUgYXV0aG9yIGhlcmVieSBkaXNjbGFpbXMgY29weXJpZ2h0IHRvIHRoaXMgc291cmNlIGNvZGUuCisgKiBodHRwczovL2dpdGh1Yi5jb20vYWFwcGxlYnkvc21oYXNoZXIvYmxvYi9tYXN0ZXIvc3JjL211cm11ckhhc2gzLmNwcAorICoqLworCisjaW5jbHVkZSAidXRpbC5ocHAiCisKKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvYmFja3BvcnRzLmhwcD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHBzeW5jIHsKKworc3RhdGljIHVpbnQzMl90CitST1RMMzIgKCB1aW50MzJfdCB4LCBpbnQ4X3QgciApCit7CisgIHJldHVybiAoeCA8PCByKSB8ICh4ID4+ICgzMiAtIHIpKTsKK30KKwordWludDMyX3QKK211cm11ckhhc2gzKHVpbnQzMl90IG5IYXNoU2VlZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIHZEYXRhVG9IYXNoKQoreworICB1aW50MzJfdCBoMSA9IG5IYXNoU2VlZDsKKyAgY29uc3QgdWludDMyX3QgYzEgPSAweGNjOWUyZDUxOworICBjb25zdCB1aW50MzJfdCBjMiA9IDB4MWI4NzM1OTM7CisKKyAgY29uc3Qgc2l6ZV90IG5ibG9ja3MgPSB2RGF0YVRvSGFzaC5zaXplKCkgLyA0OworCisgIC8vLS0tLS0tLS0tLQorICAvLyBib2R5CisgIGNvbnN0IHVpbnQzMl90ICogYmxvY2tzID0gKGNvbnN0IHVpbnQzMl90ICopKCZ2RGF0YVRvSGFzaFswXSArIG5ibG9ja3MqNCk7CisKKyAgZm9yIChzaXplX3QgaSA9IC1uYmxvY2tzOyBpOyBpKyspIHsKKyAgICB1aW50MzJfdCBrMSA9IGJsb2Nrc1tpXTsKKworICAgIGsxICo9IGMxOworICAgIGsxID0gUk9UTDMyKGsxLDE1KTsKKyAgICBrMSAqPSBjMjsKKworICAgIGgxIF49IGsxOworICAgIGgxID0gUk9UTDMyKGgxLDEzKTsKKyAgICBoMSA9IGgxKjUrMHhlNjU0NmI2NDsKKyAgfQorCisgIC8vLS0tLS0tLS0tLQorICAvLyB0YWlsCisgIGNvbnN0IHVpbnQ4X3QgKiB0YWlsID0gKGNvbnN0IHVpbnQ4X3QqKSgmdkRhdGFUb0hhc2hbMF0gKyBuYmxvY2tzKjQpOworCisgIHVpbnQzMl90IGsxID0gMDsKKworICBzd2l0Y2ggKHZEYXRhVG9IYXNoLnNpemUoKSAmIDMpIHsKKyAgICBjYXNlIDM6CisgICAgICBrMSBePSB0YWlsWzJdIDw8IDE2OworICAgICAgTkROX0NYWF9GQUxMVEhST1VHSDsKKworICAgIGNhc2UgMjoKKyAgICAgIGsxIF49IHRhaWxbMV0gPDwgODsKKyAgICAgIE5ETl9DWFhfRkFMTFRIUk9VR0g7CisKKyAgICBjYXNlIDE6CisgICAgICBrMSBePSB0YWlsWzBdOworICAgICAgazEgKj0gYzE7IGsxID0gUk9UTDMyKGsxLDE1KTsgazEgKj0gYzI7IGgxIF49IGsxOworICB9CisKKyAgLy8tLS0tLS0tLS0tCisgIC8vIGZpbmFsaXphdGlvbgorICBoMSBePSB2RGF0YVRvSGFzaC5zaXplKCk7CisgIGgxIF49IGgxID4+IDE2OworICBoMSAqPSAweDg1ZWJjYTZiOworICBoMSBePSBoMSA+PiAxMzsKKyAgaDEgKj0gMHhjMmIyYWUzNTsKKyAgaDEgXj0gaDEgPj4gMTY7CisKKyAgcmV0dXJuIGgxOworfQorCit1aW50MzJfdAorbXVybXVySGFzaDModWludDMyX3Qgbkhhc2hTZWVkLCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKQoreworICByZXR1cm4gbXVybXVySGFzaDMobkhhc2hTZWVkLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPihzdHIuYmVnaW4oKSwgc3RyLmVuZCgpKSk7Cit9CisKK3VpbnQzMl90CittdXJtdXJIYXNoMyh1aW50MzJfdCBuSGFzaFNlZWQsIHVpbnQzMl90IHZhbHVlKQoreworICByZXR1cm4gbXVybXVySGFzaDMobkhhc2hTZWVkLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4oKHVuc2lnbmVkIGNoYXIqKSZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikmdmFsdWUgKyBzaXplb2YodWludDMyX3QpKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHBzeW5jCmRpZmYgLS1naXQgYS9zcmMvZGV0YWlsL3V0aWwuaHBwIGIvc3JjL2RldGFpbC91dGlsLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODBiNmVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2RldGFpbC91dGlsLmhwcApAQCAtMCwwICsxLDUzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFBTeW5jLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgUFN5bmMgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIFBTeW5jIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFBTeW5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIFBTeW5jLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogbXVybXVySGFzaDMgd2FzIHdyaXR0ZW4gYnkgQXVzdGluIEFwcGxlYnksIGFuZCBpcyBwbGFjZWQgaW4gdGhlIHB1YmxpYworICogZG9tYWluLiBUaGUgYXV0aG9yIGhlcmVieSBkaXNjbGFpbXMgY29weXJpZ2h0IHRvIHRoaXMgc291cmNlIGNvZGUuCisgKiBodHRwczovL2dpdGh1Yi5jb20vYWFwcGxlYnkvc21oYXNoZXIvYmxvYi9tYXN0ZXIvc3JjL211cm11ckhhc2gzLmNwcAorICoqLworCisjaWZuZGVmIFBTWU5DX1VUSUxfSFBQCisjZGVmaW5lIFBTWU5DX1VUSUxfSFBQCisKKyNpbmNsdWRlIDxuZG4tY3h4L25hbWUuaHBwPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgcHN5bmMgeworCit1aW50MzJfdAorbXVybXVySGFzaDModWludDMyX3Qgbkhhc2hTZWVkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiYgdkRhdGFUb0hhc2gpOworCit1aW50MzJfdAorbXVybXVySGFzaDModWludDMyX3Qgbkhhc2hTZWVkLCBjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKwordWludDMyX3QKK211cm11ckhhc2gzKHVpbnQzMl90IG5IYXNoU2VlZCwgdWludDMyX3QgdmFsdWUpOworCitzdHJ1Y3QgTWlzc2luZ0RhdGFJbmZvCit7CisgIG5kbjo6TmFtZSBwcmVmaXg7CisgIHVpbnQ2NF90IGxvd1NlcTsKKyAgdWludDY0X3QgaGlnaFNlcTsKK307CisKK30gLy8gbmFtZXNwYWNlIHBzeW5jCisKKyNlbmRpZiAvLyBQU1lOQ19VVElMX0hQUApkaWZmIC0tZ2l0IGEvc3JjL2Z1bGwtcHJvZHVjZXIuY3BwIGIvc3JjL2Z1bGwtcHJvZHVjZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNGQ0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVsbC1wcm9kdWNlci5jcHAKQEAgLTAsMCArMSw0NjYgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkxTUiAoTmFtZWQtZGF0YSBMaW5rIFN0YXRlIFJvdXRpbmcpLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgTkxTUiBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogTkxTUiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBOTFNSIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIE5MU1IsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImZ1bGwtcHJvZHVjZXIuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2xvZ2dlci5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL3NlZ21lbnQtZmV0Y2hlci5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS92YWxpZGF0b3ItbnVsbC5ocHA+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgcHN5bmMgeworCitORE5fTE9HX0lOSVQocHN5bmMuRnVsbFByb2R1Y2VyKTsKKworRnVsbFByb2R1Y2VyOjpGdWxsUHJvZHVjZXIoY29uc3Qgc2l6ZV90IGV4cGVjdGVkTnVtRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6RmFjZSYgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6TmFtZSYgc3luY1ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6TmFtZSYgdXNlclByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVwZGF0ZUNhbGxiYWNrJiBvblVwZGF0ZUNhbGxCYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgc3luY0ludGVyZXN0TGlmZXRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBzeW5jUmVwbHlGcmVzaG5lc3MpCisgIDogUHJvZHVjZXJCYXNlKGV4cGVjdGVkTnVtRW50cmllcywgZmFjZSwgc3luY1ByZWZpeCwgdXNlclByZWZpeCwgc3luY1JlcGx5RnJlc2huZXNzKQorICAsIG1fc3luY0ludGVyZXN0TGlmZXRpbWUoc3luY0ludGVyZXN0TGlmZXRpbWUpCisgICwgbV9vblVwZGF0ZShvblVwZGF0ZUNhbGxCYWNrKQorICAsIG1fb3V0c3RhbmRpbmdJbnRlcmVzdElkKG51bGxwdHIpCisgICwgbV9zY2hlZHVsZWRTeW5jSW50ZXJlc3RJZChtX3NjaGVkdWxlcikKK3sKKyAgaW50IGppdHRlciA9IG1fc3luY0ludGVyZXN0TGlmZXRpbWUuY291bnQoKSAqIC4yMDsKKyAgbV9qaXR0ZXIgPSBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjw+KC1qaXR0ZXIsIGppdHRlcik7CisKKyAgbV9yZWdpc3RlclByZWZpeElkID0KKyAgICBtX2ZhY2Uuc2V0SW50ZXJlc3RGaWx0ZXIobmRuOjpJbnRlcmVzdEZpbHRlcihtX3N5bmNQcmVmaXgpLmFsbG93TG9vcGJhY2soZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJkZ1bGxQcm9kdWNlcjo6b25JbnRlcmVzdCwgdGhpcywgXzEsIF8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZGdWxsUHJvZHVjZXI6Om9uUmVnaXN0ZXJGYWlsZWQsIHRoaXMsIF8xLCBfMikpOworCisgIC8vIFNob3VsZCB3ZSBkbyB0aGlzIGFmdGVyIHNldEludGVyZXN0RmlsdGVyIHN1Y2Nlc3MgY2FsbCBiYWNrCisgIC8vIChDdXJyZW50bHkgZm9sbG93aW5nIENocm9ub1N5bmMncyB3YXkpCisgIHNlbmRTeW5jSW50ZXJlc3QoKTsKK30KKworRnVsbFByb2R1Y2VyOjp+RnVsbFByb2R1Y2VyKCkKK3sKKyAgaWYgKG1fb3V0c3RhbmRpbmdJbnRlcmVzdElkICE9IG51bGxwdHIpIHsKKyAgICBtX2ZhY2UucmVtb3ZlUGVuZGluZ0ludGVyZXN0KG1fb3V0c3RhbmRpbmdJbnRlcmVzdElkKTsKKyAgfQorCisgIG1fZmFjZS51bnNldEludGVyZXN0RmlsdGVyKG1fcmVnaXN0ZXJQcmVmaXhJZCk7Cit9CisKK3ZvaWQKK0Z1bGxQcm9kdWNlcjo6cHVibGlzaE5hbWUoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgsIG5kbjo6b3B0aW9uYWw8dWludDY0X3Q+IHNlcSkKK3sKKyAgaWYgKG1fcHJlZml4ZXMuZmluZChwcmVmaXgpID09IG1fcHJlZml4ZXMuZW5kKCkpIHsKKyAgICBORE5fTE9HX1dBUk4oIlByZWZpeCBub3QgYWRkZWQ6ICIgPDwgcHJlZml4KTsKKyAgICByZXR1cm47CisgIH0KKworICB1aW50NjRfdCBuZXdTZXEgPSBzZXEudmFsdWVfb3IobV9wcmVmaXhlc1twcmVmaXhdICsgMSk7CisKKyAgTkROX0xPR19JTkZPKCJQdWJsaXNoOiAiPDwgcHJlZml4IDw8ICIvIiA8PCBuZXdTZXEpOworCisgIHVwZGF0ZVNlcU5vKHByZWZpeCwgbmV3U2VxKTsKKworICBzYXRpc2Z5UGVuZGluZ0ludGVyZXN0cygpOworfQorCit2b2lkCitGdWxsUHJvZHVjZXI6OnNlbmRTeW5jSW50ZXJlc3QoKQoreworICAvLyBJZiB3ZSBzZW5kIHR3byBzeW5jIGludGVyZXN0IG9uZSBhZnRlciB0aGUgb3RoZXIKKyAgLy8gc2luY2UgdGhlcmUgaXMgbm8gbmV3IGRhdGEgaW4gdGhlIG5ldHdvcmsgeWV0LAorICAvLyB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlIGl0IG1heSBzYXRpc2Z5IGJvdGggb2YgdGhlbQorICBpZiAobV9vdXRzdGFuZGluZ0ludGVyZXN0SWQgIT0gbnVsbHB0cikgeworICAgIG1fZmFjZS5yZW1vdmVQZW5kaW5nSW50ZXJlc3QobV9vdXRzdGFuZGluZ0ludGVyZXN0SWQpOworICB9CisKKyAgLy8gU3luYyBJbnRlcmVzdCBmb3JtYXQgZm9yIGZ1bGwgc3luYzogLzxzeW5jLXByZWZpeD4vPG91ckxhdGVzdElCRj4KKyAgbmRuOjpOYW1lIHN5bmNJbnRlcmVzdE5hbWUgPSBtX3N5bmNQcmVmaXg7CisKKyAgLy8gQXBwZW5kIG91ciBsYXRlc3QgSUJGCisgIG1faWJsdC5hcHBlbmRUb05hbWUoc3luY0ludGVyZXN0TmFtZSk7CisKKyAgbV9vdXRzdGFuZGluZ0ludGVyZXN0TmFtZSA9IHN5bmNJbnRlcmVzdE5hbWU7CisKKyAgbV9zY2hlZHVsZWRTeW5jSW50ZXJlc3RJZCA9CisgICAgbV9zY2hlZHVsZXIuc2NoZWR1bGVFdmVudChtX3N5bmNJbnRlcmVzdExpZmV0aW1lIC8gMiArIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKG1faml0dGVyKG1fcm5nKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10geyBzZW5kU3luY0ludGVyZXN0KCk7IH0pOworCisgIG5kbjo6SW50ZXJlc3Qgc3luY0ludGVyZXN0KHN5bmNJbnRlcmVzdE5hbWUpOworICBzeW5jSW50ZXJlc3Quc2V0SW50ZXJlc3RMaWZldGltZShtX3N5bmNJbnRlcmVzdExpZmV0aW1lKTsKKyAgLy8gT3RoZXIgc2lkZSBhcHBlbmRzIGhhc2ggb2YgSUJGIHRvIHN5bmMgZGF0YSBuYW1lCisgIHN5bmNJbnRlcmVzdC5zZXRDYW5CZVByZWZpeCh0cnVlKTsKKyAgc3luY0ludGVyZXN0LnNldE11c3RCZUZyZXNoKHRydWUpOworCisgIHN5bmNJbnRlcmVzdC5zZXROb25jZSgxKTsKKyAgc3luY0ludGVyZXN0LnJlZnJlc2hOb25jZSgpOworCisgIG1fb3V0c3RhbmRpbmdJbnRlcmVzdElkID0gbV9mYWNlLmV4cHJlc3NJbnRlcmVzdChzeW5jSW50ZXJlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJkZ1bGxQcm9kdWNlcjo6b25TeW5jRGF0YSwgdGhpcywgXzEsIF8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIChjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCwgY29uc3QgbmRuOjpscDo6TmFjayYgbmFjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORE5fTE9HX1RSQUNFKCJyZWNlaXZlZCBOYWNrIHdpdGggcmVhc29uICIgPDwgbmFjay5nZXRSZWFzb24oKSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIEludGVyZXN0IHdpdGggTm9uY2U6ICIgPDwgaW50ZXJlc3QuZ2V0Tm9uY2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10gKGNvbnN0IG5kbjo6SW50ZXJlc3QmIGludGVyZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ETl9MT0dfREVCVUcoIk9uIGZ1bGwgc3luYyB0aW1lb3V0ICIgPDwgaW50ZXJlc3QuZ2V0Tm9uY2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICBORE5fTE9HX0RFQlVHKCJzZW5kRnVsbFN5bmNJbnRlcmVzdCwgbm9uY2U6ICIgPDwgc3luY0ludGVyZXN0LmdldE5vbmNlKCkgPDwKKyAgICAgICAgICAgICAgICAiLCBoYXNoOiAiIDw8IHN0ZDo6aGFzaDxuZG46Ok5hbWU+e30oc3luY0ludGVyZXN0TmFtZSkpOworfQorCit2b2lkCitGdWxsUHJvZHVjZXI6Om9uSW50ZXJlc3QoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXhOYW1lLCBjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCkKK3sKKyAgbmRuOjpOYW1lIG5hbWVXaXRob3V0U3luY1ByZWZpeCA9IGludGVyZXN0LmdldE5hbWUoKS5nZXRTdWJOYW1lKHByZWZpeE5hbWUuc2l6ZSgpKTsKKyAgaWYgKG5hbWVXaXRob3V0U3luY1ByZWZpeC5zaXplKCkgPT0gMiAmJgorICAgICAgbmFtZVdpdGhvdXRTeW5jUHJlZml4LmdldChuYW1lV2l0aG91dFN5bmNQcmVmaXguc2l6ZSgpIC0gMSkgPT0gUkVDT1ZFUllfUFJFRklYLmdldCgwKSkgeworICAgICAgb25SZWNvdmVyeUludGVyZXN0KGludGVyZXN0KTsKKyAgfQorICBlbHNlIGlmIChuYW1lV2l0aG91dFN5bmNQcmVmaXguc2l6ZSgpID09IDEpIHsKKyAgICBvblN5bmNJbnRlcmVzdChpbnRlcmVzdCk7CisgIH0KK30KKwordm9pZAorRnVsbFByb2R1Y2VyOjpvblN5bmNJbnRlcmVzdChjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCkKK3sKKyAgbmRuOjpOYW1lIGludGVyZXN0TmFtZSA9IGludGVyZXN0LmdldE5hbWUoKTsKKyAgbmRuOjpuYW1lOjpDb21wb25lbnQgaWJsdE5hbWUgPSBpbnRlcmVzdE5hbWUuZ2V0KGludGVyZXN0TmFtZS5zaXplKCktMSk7CisKKyAgTkROX0xPR19ERUJVRygiRnVsbCBTeW5jIEludGVyZXN0IFJlY2VpdmVkLCBub25jZTogIiA8PCBpbnRlcmVzdC5nZXROb25jZSgpIDw8CisgICAgICAgICAgICAgICAgIiwgaGFzaDogIiA8PCBzdGQ6Omhhc2g8bmRuOjpOYW1lPnt9KGludGVyZXN0TmFtZSkpOworCisgIElCTFQgaWJsdChtX2V4cGVjdGVkTnVtRW50cmllcyk7CisgIHRyeSB7CisgICAgaWJsdC5pbml0aWFsaXplKGlibHROYW1lKTsKKyAgfQorICBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICBORE5fTE9HX1dBUk4oZS53aGF0KCkpOworICAgIHJldHVybjsKKyAgfQorCisgIElCTFQgZGlmZiA9IG1faWJsdCAtIGlibHQ7CisKKyAgc3RkOjpzZXQ8dWludDMyX3Q+IHBvc2l0aXZlOworICBzdGQ6OnNldDx1aW50MzJfdD4gbmVnYXRpdmU7CisKKyAgaWYgKCFkaWZmLmxpc3RFbnRyaWVzKHBvc2l0aXZlLCBuZWdhdGl2ZSkpIHsKKyAgICBORE5fTE9HX1RSQUNFKCJDYW5ub3QgZGVjb2RlIGRpZmZlcmVuY2VzLCBwb3NpdGl2ZTogIiA8PCBwb3NpdGl2ZS5zaXplKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIG5lZ2F0aXZlOiAiIDw8IG5lZ2F0aXZlLnNpemUoKSA8PCAiIG1fdGhyZXNob2xkOiAiCisgICAgICAgICAgICAgICAgICAgPDwgbV90aHJlc2hvbGQpOworCisgICAgLy8gU2VuZCBuYWNrIGlmIGdyZWF0ZXIgdGhlbiB0aHJlc2hvbGQsIGVsc2Ugc2VuZCBwb3NpdGl2ZSBiZWxvdyBhcyB1c3VhbAorICAgIC8vIE9yIHNlbmQgaWYgd2UgY2FuJ3QgZ2V0IG5laXRoZXIgcG9zaXRpdmUgbm9yIG5lZ2F0aXZlIGRpZmZlcmVuY2VzCisgICAgaWYgKHBvc2l0aXZlLnNpemUoKSArIG5lZ2F0aXZlLnNpemUoKSA+PSBtX3RocmVzaG9sZCB8fAorICAgICAgICAocG9zaXRpdmUuc2l6ZSgpID09IDAgJiYgbmVnYXRpdmUuc2l6ZSgpID09IDApKSB7CisKKyAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gb2ZmZXIgbWVhbnMgdGhhdAorICAgICAgLy8gd2UgYXJlIGJlaGluZCBhbmQgc2hvdWxkIG5vdCBtaXNsZWFkIG90aGVyIG5vZGVzLgorICAgICAgYm9vbCBoYXZlU29tZXRoaW5nVG9PZmZlciA9IGZhbHNlOworICAgICAgZm9yIChjb25zdCBhdXRvJiBjb250ZW50IDogbV9wcmVmaXhlcykgeworICAgICAgICBpZiAoY29udGVudC5zZWNvbmQgIT0gMCkgeworICAgICAgICAgIGhhdmVTb21ldGhpbmdUb09mZmVyID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoaGF2ZVNvbWV0aGluZ1RvT2ZmZXIpIHsKKyAgICAgICAgc2VuZEFwcGxpY2F0aW9uTmFjayhpbnRlcmVzdE5hbWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIFN0YXRlIHN0YXRlOworICBmb3IgKGNvbnN0IGF1dG8mIGhhc2ggOiBwb3NpdGl2ZSkgeworICAgIG5kbjo6TmFtZSBwcmVmaXggPSBtX2hhc2gycHJlZml4W2hhc2hdOworICAgIC8vIERvbid0IHN5bmMgdXAgc2VxdWVuY2UgbnVtYmVyIHplcm8KKyAgICBpZiAobV9wcmVmaXhlc1twcmVmaXhdICE9IDAgJiYgIWlzRnV0dXJlSGFzaChwcmVmaXgudG9VcmkoKSwgbmVnYXRpdmUpKSB7CisgICAgICBzdGF0ZS5hZGRDb250ZW50KG5kbjo6TmFtZShwcmVmaXgpLmFwcGVuZE51bWJlcihtX3ByZWZpeGVzW3ByZWZpeF0pKTsKKyAgICB9CisgIH0KKworICBpZiAoIXN0YXRlLmdldENvbnRlbnQoKS5lbXB0eSgpKSB7CisgICAgTkROX0xPR19ERUJVRygiU2VuZGluZyBzeW5jIGNvbnRlbnQ6ICIgPDwgc3RhdGUpOworICAgIHNlbmRTeW5jRGF0YShpbnRlcmVzdE5hbWUsIHN0YXRlLndpcmVFbmNvZGUoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgbmRuOjp1dGlsOjpzY2hlZHVsZXI6OlNjb3BlZEV2ZW50SWQgc2NvcGVkRXZlbnRJZChtX3NjaGVkdWxlcik7CisgIGF1dG8gaXQgPSBtX3BlbmRpbmdFbnRyaWVzLmVtcGxhY2UoaW50ZXJlc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdFbnRyeUluZm9GdWxse2libHQsIHN0ZDo6bW92ZShzY29wZWRFdmVudElkKX0pOworCisgIGl0LmZpcnN0LT5zZWNvbmQuZXhwaXJhdGlvbkV2ZW50ID0KKyAgICBtX3NjaGVkdWxlci5zY2hlZHVsZUV2ZW50KGludGVyZXN0LmdldEludGVyZXN0TGlmZXRpbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLCBpbnRlcmVzdF0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORE5fTE9HX1RSQUNFKCJFcmFzZSBQZW5kaW5nIEludGVyZXN0ICIgPDwgaW50ZXJlc3QuZ2V0Tm9uY2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGVuZGluZ0VudHJpZXMuZXJhc2UoaW50ZXJlc3QuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworfQorCit2b2lkCitGdWxsUHJvZHVjZXI6Om9uUmVjb3ZlcnlJbnRlcmVzdChjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCkKK3sKKyAgTkROX0xPR19ERUJVRygiUmVjb3ZlcnkgaW50ZXJlc3QgcmVjZWl2ZWQiKTsKKworICBTdGF0ZSBzdGF0ZTsKKyAgZm9yIChjb25zdCBhdXRvJiBjb250ZW50IDogbV9wcmVmaXhlcykgeworICAgIGlmIChjb250ZW50LnNlY29uZCAhPSAwKSB7CisgICAgICBzdGF0ZS5hZGRDb250ZW50KG5kbjo6TmFtZShjb250ZW50LmZpcnN0KS5hcHBlbmROdW1iZXIoY29udGVudC5zZWNvbmQpKTsKKyAgICB9CisgIH0KKworICAvLyBTZW5kIGV2ZW4gaWYgc3RhdGUgaXMgZW1wdHkgdG8gbGV0IG90aGVyIHNpZGUga25vdyB0aGF0IHdlIGFyZSBiZWhpbmQKKyAgc2VuZFJlY292ZXJ5RGF0YShpbnRlcmVzdC5nZXROYW1lKCksIHN0YXRlKTsKK30KKwordm9pZAorRnVsbFByb2R1Y2VyOjpzZW5kU3luY0RhdGEoY29uc3QgbmRuOjpOYW1lJiBuYW1lLCBjb25zdCBuZG46OkJsb2NrJiBibG9jaykKK3sKKyAgTkROX0xPR19ERUJVRygiQ2hlY2tpbmcgaWYgZGF0YSB3aWxsIHNhdGlzZnkgb3VyIG93biBwZW5kaW5nIGludGVyZXN0Iik7CisKKyAgbmRuOjpOYW1lIG5hbWVXaXRoSWJsdDsKKyAgbV9pYmx0LmFwcGVuZFRvTmFtZShuYW1lV2l0aElibHQpOworCisgIC8vIEFwcGVuZCBoYXNoIG9mIG91ciBJQkYgc28gdGhhdCBkYXRhIG5hbWUgbWF5YmUgZGlmZmVyZW50IGZvciBlYWNoIG5vZGUgYW5zd2VyaW5nCisgIG5kbjo6RGF0YSBkYXRhKG5kbjo6TmFtZShuYW1lKS5hcHBlbmROdW1iZXIoc3RkOjpoYXNoPG5kbjo6TmFtZT57fShuYW1lV2l0aElibHQpKSk7CisgIGRhdGEuc2V0RnJlc2huZXNzUGVyaW9kKG1fc3luY1JlcGx5RnJlc2huZXNzKTsKKyAgZGF0YS5zZXRDb250ZW50KGJsb2NrKTsKKyAgbV9rZXlDaGFpbi5zaWduKGRhdGEpOworCisgIC8vIGNoZWNraW5nIGlmIG91ciBvd24gaW50ZXJlc3QgZ290IHNhdGlzZmllZAorICBpZiAobV9vdXRzdGFuZGluZ0ludGVyZXN0TmFtZSA9PSBuYW1lKSB7CisgICAgTkROX0xPR19ERUJVRygiU2F0aXNmaWVkIG91ciBvd24gcGVuZGluZyBpbnRlcmVzdCIpOworICAgIC8vIHJlbW92ZSBvdXRzdGFuZGluZyBpbnRlcmVzdAorICAgIGlmIChtX291dHN0YW5kaW5nSW50ZXJlc3RJZCAhPSBudWxscHRyKSB7CisgICAgICBORE5fTE9HX0RFQlVHKCJSZW1vdmluZyBvdXIgcGVuZGluZyBpbnRlcmVzdCBmcm9tIGZhY2UiKTsKKyAgICAgIG1fZmFjZS5yZW1vdmVQZW5kaW5nSW50ZXJlc3QobV9vdXRzdGFuZGluZ0ludGVyZXN0SWQpOworICAgICAgbV9vdXRzdGFuZGluZ0ludGVyZXN0SWQgPSBudWxscHRyOworICAgICAgbV9vdXRzdGFuZGluZ0ludGVyZXN0TmFtZSA9IG5kbjo6TmFtZSgiIik7CisgICAgfQorCisgICAgTkROX0xPR19ERUJVRygiU2VuZGluZyBTeW5jIERhdGEiKTsKKworICAgIC8vIFNlbmQgZGF0YSBhZnRlciByZW1vdmluZyBwZW5kaW5nIHN5bmMgaW50ZXJlc3Qgb24gZmFjZQorICAgIG1fZmFjZS5wdXQoZGF0YSk7CisKKyAgICBORE5fTE9HX1RSQUNFKCJSZW5ld2luZyBzeW5jIGludGVyZXN0Iik7CisgICAgc2VuZFN5bmNJbnRlcmVzdCgpOworICB9CisgIGVsc2UgeworICAgIE5ETl9MT0dfREVCVUcoIlNlbmRpbmcgU3luYyBEYXRhIik7CisgICAgbV9mYWNlLnB1dChkYXRhKTsKKyAgfQorfQorCit2b2lkCitGdWxsUHJvZHVjZXI6Om9uU3luY0RhdGEoY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QsIGNvbnN0IG5kbjo6RGF0YSYgZGF0YSkKK3sKKyAgbmRuOjpOYW1lIGludGVyZXN0TmFtZSA9IGludGVyZXN0LmdldE5hbWUoKTsKKyAgZGVsZXRlUGVuZGluZ0ludGVyZXN0cyhpbnRlcmVzdC5nZXROYW1lKCkpOworCisgIGlmIChkYXRhLmdldENvbnRlbnRUeXBlKCkgPT0gbmRuOjp0bHY6OkNvbnRlbnRUeXBlX05hY2spIHsKKyAgICBORE5fTE9HX0RFQlVHKCJHb3QgYXBwbGljYXRpb24gbmFjaywgc2VuZGluZyByZWNvdmVyeSBpbnRlcmVzdCIpOworICAgIHNlbmRSZWNvdmVyeUludGVyZXN0KGludGVyZXN0KTsKKyAgICByZXR1cm47CisgIH0KKworICBTdGF0ZSBzdGF0ZShkYXRhLmdldENvbnRlbnQoKSk7CisgIHN0ZDo6dmVjdG9yPE1pc3NpbmdEYXRhSW5mbz4gdXBkYXRlczsKKworICBpZiAoaW50ZXJlc3ROYW1lLmdldChpbnRlcmVzdE5hbWUuc2l6ZSgpLTEpID09IFJFQ09WRVJZX1BSRUZJWC5nZXQoMCkgJiYKKyAgICAgIHN0YXRlLmdldENvbnRlbnQoKS5lbXB0eSgpKSB7CisgICAgTkROX0xPR19UUkFDRSgiUmVjb3ZlcnkgZGF0YSBpcyBlbXB0eSwgb3RoZXIgc2lkZSBpcyBiZWhpbmQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBORE5fTE9HX0RFQlVHKCJTeW5jIERhdGEgUmVjZWl2ZWQ6ICAiIDw8IHN0YXRlKTsKKworICBmb3IgKGNvbnN0IGF1dG8mIGNvbnRlbnQgOiBzdGF0ZS5nZXRDb250ZW50KCkpIHsKKyAgICBuZG46Ok5hbWUgcHJlZml4ID0gY29udGVudC5nZXRQcmVmaXgoLTEpOworICAgIHVpbnQ2NF90IHNlcSA9IGNvbnRlbnQuZ2V0KGNvbnRlbnQuc2l6ZSgpLTEpLnRvTnVtYmVyKCk7CisKKyAgICBpZiAobV9wcmVmaXhlcy5maW5kKHByZWZpeCkgPT0gbV9wcmVmaXhlcy5lbmQoKSB8fCBtX3ByZWZpeGVzW3ByZWZpeF0gPCBzZXEpIHsKKyAgICAgIHVwZGF0ZXMucHVzaF9iYWNrKE1pc3NpbmdEYXRhSW5mb3twcmVmaXgsIG1fcHJlZml4ZXNbcHJlZml4XSArIDEsIHNlcX0pOworICAgICAgdXBkYXRlU2VxTm8ocHJlZml4LCBzZXEpOworICAgICAgLy8gV2Ugc2hvdWxkIG5vdCBjYWxsIHNhdGlzZnlQZW5kaW5nU3luY0ludGVyZXN0cyBoZXJlIGJlY2F1c2Ugd2UganVzdAorICAgICAgLy8gZ290IGRhdGEgYW5kIGRlbGV0ZWQgcGVuZGluZyBpbnRlcmVzdCBieSBjYWxsaW5nIGRlbGV0ZVBlbmRpbmdGdWxsU3luY0ludGVyZXN0cworICAgICAgLy8gQnV0IHdlIG1pZ2h0IGhhdmUgaW50ZXJlc3RzIG5vdCBtYXRjaGluZyB0byB0aGlzIGludGVyZXN0IHRoYXQgbWlnaHQgbm90IGhhdmUgZGVsZXRlZAorICAgICAgLy8gZnJvbSBwZW5kaW5nIHN5bmMgaW50ZXJlc3QKKyAgICB9CisgIH0KKworICAvLyBXZSBqdXN0IGdvdCB0aGUgZGF0YSwgc28gc2VuZCBhIG5ldyBzeW5jIGludGVyZXN0CisgIGlmICghdXBkYXRlcy5lbXB0eSgpKSB7CisgICAgbV9vblVwZGF0ZSh1cGRhdGVzKTsKKyAgICBORE5fTE9HX1RSQUNFKCJSZW5ld2luZyBzeW5jIGludGVyZXN0Iik7CisgICAgc2VuZFN5bmNJbnRlcmVzdCgpOworICB9CisgIGVsc2UgeworICAgIE5ETl9MT0dfVFJBQ0UoIk5vIG5ldyB1cGRhdGUsIGludGVyZXN0IG5vbmNlOiAiIDw8IGludGVyZXN0LmdldE5vbmNlKCkgIDw8CisgICAgICAgICAgICAgICAgICAiICwgaGFzaDogIiA8PCBzdGQ6Omhhc2g8bmRuOjpOYW1lPnt9KGludGVyZXN0TmFtZSkpOworICB9Cit9CisKK3ZvaWQKK0Z1bGxQcm9kdWNlcjo6c2F0aXNmeVBlbmRpbmdJbnRlcmVzdHMoKQoreworICBORE5fTE9HX0RFQlVHKCJTYXRpc2Z5aW5nIGZ1bGwgc3luYyBpbnRlcmVzdDogIiA8PCBtX3BlbmRpbmdFbnRyaWVzLnNpemUoKSk7CisKKyAgZm9yIChhdXRvIGl0ID0gbV9wZW5kaW5nRW50cmllcy5iZWdpbigpOyBpdCAhPSBtX3BlbmRpbmdFbnRyaWVzLmVuZCgpOykgeworICAgIGNvbnN0IFBlbmRpbmdFbnRyeUluZm9GdWxsJiBlbnRyeSA9IGl0LT5zZWNvbmQ7CisgICAgSUJMVCBkaWZmID0gbV9pYmx0IC0gZW50cnkuaWJsdDsKKyAgICBzdGQ6OnNldDx1aW50MzJfdD4gcG9zaXRpdmU7CisgICAgc3RkOjpzZXQ8dWludDMyX3Q+IG5lZ2F0aXZlOworCisgICAgaWYgKCFkaWZmLmxpc3RFbnRyaWVzKHBvc2l0aXZlLCBuZWdhdGl2ZSkpIHsKKyAgICAgIE5ETl9MT0dfVFJBQ0UoIkRlY29kZSBmYWlsZWQgZm9yIHBlbmRpbmcgaW50ZXJlc3QiKTsKKyAgICAgIGlmIChwb3NpdGl2ZS5zaXplKCkgKyBuZWdhdGl2ZS5zaXplKCkgPj0gbV90aHJlc2hvbGQgfHwKKyAgICAgICAgICAocG9zaXRpdmUuc2l6ZSgpID09IDAgJiYgbmVnYXRpdmUuc2l6ZSgpID09IDApKSB7CisgICAgICAgIE5ETl9MT0dfVFJBQ0UoInBvcyArIG5lZyA+IHRocmVzaG9sZCBvciBubyBkaWZmIGNhbiBiZSBmb3VuZCwgZXJhc2UgcGVuZGluZyBpbnRlcmVzdCIpOworICAgICAgICBtX3BlbmRpbmdFbnRyaWVzLmVyYXNlKGl0KyspOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTdGF0ZSBzdGF0ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhhc2ggOiBwb3NpdGl2ZSkgeworICAgICAgbmRuOjpOYW1lIHByZWZpeCA9IG1faGFzaDJwcmVmaXhbaGFzaF07CisKKyAgICAgIGlmIChtX3ByZWZpeGVzW3ByZWZpeF0gIT0gMCkgeworICAgICAgICBzdGF0ZS5hZGRDb250ZW50KG5kbjo6TmFtZShwcmVmaXgpLmFwcGVuZE51bWJlcihtX3ByZWZpeGVzW3ByZWZpeF0pKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN0YXRlLmdldENvbnRlbnQoKS5lbXB0eSgpKSB7CisgICAgICBORE5fTE9HX0RFQlVHKCJTYXRpc2Z5aW5nIHN5bmMgY29udGVudDogIiA8PCBzdGF0ZSk7CisgICAgICBzZW5kU3luY0RhdGEoaXQtPmZpcnN0LCBzdGF0ZS53aXJlRW5jb2RlKCkpOworICAgICAgbV9wZW5kaW5nRW50cmllcy5lcmFzZShpdCsrKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICArK2l0OworICAgIH0KKyAgfQorfQorCitib29sCitGdWxsUHJvZHVjZXI6OmlzRnV0dXJlSGFzaChjb25zdCBuZG46Ok5hbWUmIHByZWZpeCwgY29uc3Qgc3RkOjpzZXQ8dWludDMyX3Q+JiBuZWdhdGl2ZSkKK3sKKyAgdWludDMyX3QgbmV4dEhhc2ggPSBtdXJtdXJIYXNoMyhOX0hBU0hDSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46Ok5hbWUocHJlZml4KS5hcHBlbmROdW1iZXIobV9wcmVmaXhlc1twcmVmaXhdICsgMSkudG9VcmkoKSk7CisgIGZvciAoY29uc3QgYXV0byYgbkhhc2ggOiBuZWdhdGl2ZSkgeworICAgIGlmIChuSGFzaCA9PSBuZXh0SGFzaCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkCitGdWxsUHJvZHVjZXI6OmRlbGV0ZVBlbmRpbmdJbnRlcmVzdHMoY29uc3QgbmRuOjpOYW1lJiBpbnRlcmVzdE5hbWUpIHsKKyAgZm9yIChhdXRvIGl0ID0gbV9wZW5kaW5nRW50cmllcy5iZWdpbigpOyBpdCAhPSBtX3BlbmRpbmdFbnRyaWVzLmVuZCgpOykgeworICAgIGlmIChpdC0+Zmlyc3QgPT0gaW50ZXJlc3ROYW1lKSB7CisgICAgICBORE5fTE9HX1RSQUNFKCJEZWxldGUgcGVuZGluZyBpbnRlcmVzdDogIiA8PCBpbnRlcmVzdE5hbWUpOworICAgICAgbV9wZW5kaW5nRW50cmllcy5lcmFzZShpdCsrKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICArK2l0OworICAgIH0KKyAgfQorfQorCit2b2lkCitGdWxsUHJvZHVjZXI6OnNlbmRSZWNvdmVyeURhdGEoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgsIGNvbnN0IFN0YXRlJiBzdGF0ZSkKK3sKKyAgbmRuOjpFbmNvZGluZ0J1ZmZlciBidWZmZXI7CisgIGJ1ZmZlci5wcmVwZW5kQmxvY2soc3RhdGUud2lyZUVuY29kZSgpKTsKKworICBjb25zdCB1aW50OF90KiByYXdCdWZmZXIgPSBidWZmZXIuYnVmKCk7CisgIGNvbnN0IHVpbnQ4X3QqIHNlZ21lbnRCZWdpbiA9IHJhd0J1ZmZlcjsKKyAgY29uc3QgdWludDhfdCogZW5kID0gcmF3QnVmZmVyICsgYnVmZmVyLnNpemUoKTsKKworICB1aW50NjRfdCBzZWdtZW50Tm8gPSAwOworICBkbyB7CisgICAgY29uc3QgdWludDhfdCogc2VnbWVudEVuZCA9IHNlZ21lbnRCZWdpbiArIChuZG46Ok1BWF9ORE5fUEFDS0VUX1NJWkUgPj4gMSk7CisgICAgaWYgKHNlZ21lbnRFbmQgPiBlbmQpIHsKKyAgICAgIHNlZ21lbnRFbmQgPSBlbmQ7CisgICAgfQorCisgICAgbmRuOjpOYW1lIHNlZ21lbnROYW1lKHByZWZpeCk7CisgICAgc2VnbWVudE5hbWUuYXBwZW5kU2VnbWVudChzZWdtZW50Tm8pOworCisgICAgc3RkOjpzaGFyZWRfcHRyPG5kbjo6RGF0YT4gZGF0YSA9IHN0ZDo6bWFrZV9zaGFyZWQ8bmRuOjpEYXRhPihzZWdtZW50TmFtZSk7CisgICAgZGF0YS0+c2V0Q29udGVudChzZWdtZW50QmVnaW4sIHNlZ21lbnRFbmQgLSBzZWdtZW50QmVnaW4pOworICAgIGRhdGEtPnNldEZyZXNobmVzc1BlcmlvZChtX3N5bmNSZXBseUZyZXNobmVzcyk7CisKKyAgICBzZWdtZW50QmVnaW4gPSBzZWdtZW50RW5kOworICAgIGlmIChzZWdtZW50QmVnaW4gPj0gZW5kKSB7CisgICAgICBkYXRhLT5zZXRGaW5hbEJsb2NrKHNlZ21lbnROYW1lWy0xXSk7CisgICAgfQorCisgICAgbV9rZXlDaGFpbi5zaWduKCpkYXRhKTsKKyAgICBtX2ZhY2UucHV0KCpkYXRhKTsKKworICAgIE5ETl9MT0dfREVCVUcoIlNlbmRpbmcgcmVjb3ZlcnkgZGF0YSwgc2VxOiAiIDw8IHNlZ21lbnRObyk7CisKKyAgICArK3NlZ21lbnRObzsKKyAgfSB3aGlsZSAoc2VnbWVudEJlZ2luIDwgZW5kKTsKK30KKwordm9pZAorRnVsbFByb2R1Y2VyOjpzZW5kUmVjb3ZlcnlJbnRlcmVzdChjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCkKK3sKKyAgaWYgKG1fb3V0c3RhbmRpbmdJbnRlcmVzdElkICE9IG51bGxwdHIpIHsKKyAgICBtX2ZhY2UucmVtb3ZlUGVuZGluZ0ludGVyZXN0KG1fb3V0c3RhbmRpbmdJbnRlcmVzdElkKTsKKyAgICBtX291dHN0YW5kaW5nSW50ZXJlc3RJZCA9IG51bGxwdHI7CisgIH0KKworICBuZG46Ok5hbWUgaWJsdE5hbWU7CisgIG1faWJsdC5hcHBlbmRUb05hbWUoaWJsdE5hbWUpOworCisgIG5kbjo6TmFtZSByZWNvdmVyeUludGVyZXN0TmFtZShtX3N5bmNQcmVmaXgpOworICByZWNvdmVyeUludGVyZXN0TmFtZS5hcHBlbmROdW1iZXIoc3RkOjpoYXNoPG5kbjo6TmFtZT57fShpYmx0TmFtZSkpOworICByZWNvdmVyeUludGVyZXN0TmFtZS5hcHBlbmQoUkVDT1ZFUllfUFJFRklYKTsKKworICBuZG46OkludGVyZXN0IHJlY292ZXJ5SW50ZXJlc3QocmVjb3ZlcnlJbnRlcmVzdE5hbWUpOworICByZWNvdmVyeUludGVyZXN0LnNldEludGVyZXN0TGlmZXRpbWUobV9zeW5jSW50ZXJlc3RMaWZldGltZSk7CisKKyAgYXV0byBmZXRjaGVyID0gbmRuOjp1dGlsOjpTZWdtZW50RmV0Y2hlcjo6c3RhcnQobV9mYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyeUludGVyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnNlY3VyaXR5Ojp2Mjo6Z2V0QWNjZXB0QWxsVmFsaWRhdG9yKCkpOworCisgIGZldGNoZXItPm9uQ29tcGxldGUuY29ubmVjdChbdGhpcywgcmVjb3ZlcnlJbnRlcmVzdF0gKG5kbjo6Q29uc3RCdWZmZXJQdHIgYnVmZmVyUHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ETl9MT0dfVFJBQ0UoIlNlZ21lbnQgZmV0Y2hlciBnb3QgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OkRhdGEgZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXRDb250ZW50KHN0ZDo6bW92ZShidWZmZXJQdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TeW5jRGF0YShyZWNvdmVyeUludGVyZXN0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgIGZldGNoZXItPm9uRXJyb3IuY29ubmVjdChbXSAodWludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ETl9MT0dfRVJST1IoIkNhbm5vdCByZWNvdmVyLCBlcnJvcjogIiA8PCBlcnJvckNvZGUgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG1lc3NhZ2U6ICIgPDwgbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworfQorCit9IC8vIG5hbWVzcGFjZSBwc3luYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9mdWxsLXByb2R1Y2VyLmhwcCBiL3NyYy9mdWxsLXByb2R1Y2VyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk3NTIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bGwtcHJvZHVjZXIuaHBwCkBAIC0wLDAgKzEsMjQzIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5MU1IgKE5hbWVkLWRhdGEgTGluayBTdGF0ZSBSb3V0aW5nKS4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIE5MU1IgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIE5MU1IgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTkxTUiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBOTFNSLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpZm5kZWYgUFNZTkNfRlVMTF9QUk9EVUNFUl9IUFAKKyNkZWZpbmUgUFNZTkNfRlVMTF9QUk9EVUNFUl9IUFAKKworI2luY2x1ZGUgInByb2R1Y2VyLWJhc2UuaHBwIgorI2luY2x1ZGUgImRldGFpbC9zdGF0ZS5ocHAiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDxyYW5kb20+CisKKyNpbmNsdWRlIDxuZG4tY3h4L2ZhY2UuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9zY2hlZHVsZXIuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9zY2hlZHVsZXItc2NvcGVkLWV2ZW50LWlkLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvdGltZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9zZWN1cml0eS9rZXktY2hhaW4uaHBwPgorCituYW1lc3BhY2UgcHN5bmMgeworCisvLyBOYW1lIGhhcyB0byBiZSBkaWZmZXJlbnQgdGhhbiBQZW5kaW5nRW50cnlJbmZvCisvLyB1c2VkIGluIHBhcnRpYWwtcHJvZHVjZXIgb3RoZXJ3aXNlIGdldCBzdHJhbmdlIHNlZ21lbnRhdGlvbi1mYXVsdHMKKy8vIHdoZW4gcGFydGlhbCBwcm9kdWNlciBpcyBkZXN0cnVjdGVkCitzdHJ1Y3QgUGVuZGluZ0VudHJ5SW5mb0Z1bGwKK3sKKyAgSUJMVCBpYmx0OworICBuZG46OnV0aWw6OnNjaGVkdWxlcjo6U2NvcGVkRXZlbnRJZCBleHBpcmF0aW9uRXZlbnQ7Cit9OworCit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnZlY3RvcjxNaXNzaW5nRGF0YUluZm8+Jik+IFVwZGF0ZUNhbGxiYWNrOworCitjb25zdCBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBTWU5DX0lOVEVSRVNUX0xJRlRJTUUgPSAxX3M7Citjb25zdCBuZG46Ok5hbWUgUkVDT1ZFUllfUFJFRklYKCJyZWNvdmVyeSIpOworCisvKioKKyAqIEBicmllZiBGdWxsIHN5bmMgbG9naWMgdG8gc3luY2hyb25pemUgd2l0aCBvdGhlciBub2RlcworICogICAgICAgIHdoZXJlIGFsbCBub2RlcyB3YW50cyB0byBnZXQgYWxsIG5hbWVzIHByZWZpeGVzIHN5bmNlZC4KKyAqCisgKiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCBwdWJsaXNoTmFtZSB3aGVuZXZlciBpdCB3YW50cyB0bworICogbGV0IGNvbnN1bWVycyBrbm93IHRoYXQgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGZvciB0aGUgdXNlclByZWZpeC4KKyAqIE11bHRpcGxlIHVzZXJQcmVmaXhlcyBjYW4gYmUgYWRkZWQgYnkgdXNpbmcgYWRkVXNlck5vZGUuCisgKiBDdXJyZW50bHksIGZldGNoaW5nIGFuZCBwdWJsaXNoaW5nIG9mIGRhdGEgbmVlZHMgdG8gYmUgaGFuZGxlZCBieSB0aGUgYXBwbGljYXRpb24uCisgKi8KK2NsYXNzIEZ1bGxQcm9kdWNlciA6IHB1YmxpYyBQcm9kdWNlckJhc2UKK3sKK3B1YmxpYzoKKyAgLyoqCisgICAqIEBicmllZiBjb25zdHJ1Y3RvcgorICAgKgorICAgKiBSZWdpc3RlcnMgc3luY1ByZWZpeCBpbiBORkQgYW5kIHNlbmRzIGEgc3luYyBpbnRlcmVzdAorICAgKgorICAgKiBAcGFyYW0gZXhwZWN0ZWROdW1FbnRyaWVzIGV4cGVjdGVkIGVudHJpZXMgaW4gSUJGCisgICAqIEBwYXJhbSBmYWNlIGFwcGxpY2F0aW9uJ3MgZmFjZQorICAgKiBAcGFyYW0gc3luY1ByZWZpeCBUaGUgcHJlZml4IG9mIHRoZSBzeW5jIGdyb3VwCisgICAqIEBwYXJhbSB1c2VyUHJlZml4IFRoZSBwcmVmaXggb2YgdGhlIGZpcnN0IHVzZXIgaW4gdGhlIGdyb3VwCisgICAqIEBwYXJhbSBvblVwZGF0ZUNhbGxCYWNrIFRoZSBjYWxsIGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbmV3IGRhdGEKKyAgICogQHBhcmFtIHN5bmNJbnRlcmVzdExpZmV0aW1lIGxpZmV0aW1lIG9mIHRoZSBzeW5jIGludGVyZXN0CisgICAqIEBwYXJhbSBzeW5jUmVwbHlGcmVzaG5lc3MgZnJlc2huZXNzIG9mIHN5bmMgZGF0YQorICAgKi8KKyAgRnVsbFByb2R1Y2VyKHNpemVfdCBleHBlY3RlZE51bUVudHJpZXMsCisgICAgICAgICAgICAgICBuZG46OkZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICBjb25zdCBuZG46Ok5hbWUmIHN5bmNQcmVmaXgsCisgICAgICAgICAgICAgICBjb25zdCBuZG46Ok5hbWUmIHVzZXJQcmVmaXgsCisgICAgICAgICAgICAgICBjb25zdCBVcGRhdGVDYWxsYmFjayYgb25VcGRhdGVDYWxsQmFjaywKKyAgICAgICAgICAgICAgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIHN5bmNJbnRlcmVzdExpZmV0aW1lID0gU1lOQ19JTlRFUkVTVF9MSUZUSU1FLAorICAgICAgICAgICAgICAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgc3luY1JlcGx5RnJlc2huZXNzID0gU1lOQ19SRVBMWV9GUkVTSE5FU1MpOworCisgIH5GdWxsUHJvZHVjZXIoKTsKKworICAvKioKKyAgICogQGJyaWVmIFB1Ymxpc2ggbmFtZSB0byBsZXQgb3RoZXJzIGtub3cKKyAgICoKKyAgICogYWRkVXNlck5vZGUgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGlzIHRvIGFkZCB0aGUgcHJlZml4CisgICAqIGlmIG5vdCBhbHJlYWR5IGFkZGVkIHZpYSB0aGUgY29uc3RydWN0b3IuCisgICAqIElmIHNlcSBpcyBudWxsIHRoZW4gdGhlIHNlcSBvZiBwcmVmaXggaXMgaW5jcmVtZW50ZWQgYnkgMSBlbHNlCisgICAqIHRoZSBzdXBwbGllZCBzZXF1ZW5jZSBpcyBzZXQgaW4gdGhlIElCRi4KKyAgICoKKyAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IHRvIGJlIHVwZGF0ZWQKKyAgICogQHBhcmFtIHNlcSB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBwcmVmaXgKKyAgICovCisgIHZvaWQKKyAgcHVibGlzaE5hbWUoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgsIG5kbjo6b3B0aW9uYWw8dWludDY0X3Q+IHNlcSA9IG5kbjo6bnVsbG9wdCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBAYnJpZWYgU2VuZCBzeW5jIGludGVyZXN0IGZvciBmdWxsIHN5bmNocm9uaXphdGlvbgorICAgKgorICAgKiBGb3JtcyB0aGUgaW50ZXJlc3QgbmFtZTogLzxzeW5jLXByZWZpeD4vPG93bi1JQkY+CisgICAqIENhbmNlbHMgYW55IHBlbmRpbmcgc3luYyBpbnRlcmVzdCB3ZSBzZW50IGVhcmxpZXIgb24gdGhlIGZhY2UKKyAgICogU2VuZHMgdGhlIHN5bmMgaW50ZXJlc3QKKyAgICovCisgIHZvaWQKKyAgc2VuZFN5bmNJbnRlcmVzdCgpOworCitQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BSSVZBVEU6CisgIC8qKgorICAgKiBAYnJpZWYgUHJvY2VzcyBpbnRlcmVzdCBmcm9tIG90aGVyIHBhcnRpZXMKKyAgICoKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIHN5bmMgaW50ZXJlc3Qgb3IgcmVjb3ZlcnkgaW50ZXJlc3QKKyAgICogYW5kIGRpc3BhdGNoIHRvIG9uU3luY0ludGVyZXN0IG9yIG9uUmVjb3ZlcnlJbnRlcmVzdCByZXNwZWN0aXZlbHkuCisgICAqCisgICAqIEBwYXJhbSBwcmVmaXhOYW1lIHByZWZpeCBmb3Igc3luYyBncm91cCB3aGljaCB3ZSByZWdpc3RlcmVkCisgICAqIEBwYXJhbSBpbnRlcmVzdCB0aGUgaW50ZXJlc3Qgd2UgZ290CisgICAqLworICB2b2lkCisgIG9uSW50ZXJlc3QoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXhOYW1lLCBjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBAYnJpZWYgUHJvY2VzcyBzeW5jIGludGVyZXN0IGZyb20gb3RoZXIgcGFydGllcworICAgKgorICAgKiBHZXQgZGlmZmVyZW5jZXMgYi93IG91ciBJQkYgYW5kIElCRiBpbiB0aGUgc3luYyBpbnRlcmVzdC4KKyAgICogSWYgd2UgY2Fubm90IGdldCB0aGUgZGlmZmVyZW5jZXMgc3VjY2Vzc2Z1bGx5IHRoZW4gc2VuZCBhbiBhcHBsaWNhdGlvbiBuYWNrLgorICAgKgorICAgKiBJZiB3ZSBoYXZlIHNvbWUgdGhpbmdzIGluIG91ciBJQkYgdGhhdCB0aGUgb3RoZXIgc2lkZSBkb2VzIG5vdCBoYXZlLCByZXBseSB3aXRoIHRoZSBjb250ZW50IG9yCisgICAqIElmIG5vLiBvZiBkaWZmZXJlbnQgaXRlbXMgaXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZCBvciBlcXVhbHMgemVybyB0aGVuIHNlbmQgYSBuYWNrLgorICAgKiBPdGhlcndpc2UgYWRkIHRoZSBzeW5jIGludGVyZXN0IGludG8gYSBtYXAgd2l0aCBpbnRlcmVzdCBuYW1lIGFzIGtleSBhbmQgUGVuZGluZ0VudHJ5SW5mb0Z1bGwKKyAgICogYXMgdmFsdWUuCisgICAqCisgICAqIEBwYXJhbSBpbnRlcmVzdCB0aGUgc3luYyBpbnRlcmVzdCB3ZSBnb3QKKyAgICovCisgIHZvaWQKKyAgb25TeW5jSW50ZXJlc3QoY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QpOworCisgICAvKioKKyAgICogQGJyaWVmIFB1Ymxpc2ggb3VyIGVudGlyZSBzdGF0ZSBzbyB0aGF0IHJlcXVlc3RlciBjYW4gY2F0Y2ggdXAuCisgICAqCisgICAqIEBwYXJhbSBpbnRlcmVzdCB0aGUgcmVjb3ZlcnkgaW50ZXJlc3Qgd2UgZ290CisgICAqLworICB2b2lkCisgIG9uUmVjb3ZlcnlJbnRlcmVzdChjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCk7CisKKyAgLyoqCisgICAqIEBicmllZiBTZW5kIHN5bmMgZGF0YQorICAgKgorICAgKiBDaGVjayBpZiB0aGUgZGF0YSB3aWxsIHNhdGlzZnkgb3VyIG93biBwZW5kaW5nIGludGVyZXN0LAorICAgKiByZW1vdmUgaXQgZmlyc3QgaWYgaXQgZG9lcywgYW5kIHRoZW4gcmVuZXcgdGhlIHN5bmMgaW50ZXJlc3QKKyAgICogT3RoZXJ3aXNlIGp1c3Qgc2VuZCB0aGUgZGF0YQorICAgKgorICAgKiBAcGFyYW0gbmFtZSBuYW1lIHRvIGJlIHNldCBhcyBkYXRhIG5hbWUKKyAgICogQHBhcmFtIGJsb2NrIHRoZSBjb250ZW50IG9mIHRoZSBkYXRhCisgICAqLworICB2b2lkCisgIHNlbmRTeW5jRGF0YShjb25zdCBuZG46Ok5hbWUmIG5hbWUsIGNvbnN0IG5kbjo6QmxvY2smIGJsb2NrKTsKKworICAvKioKKyAgICogQGJyaWVmIFByb2Nlc3Mgc3luYyBkYXRhCisgICAqCisgICAqIENhbGwgZGVsZXRlUGVuZGluZ0ludGVyZXN0cyB0byBkZWxldGUgYW55IHBlbmRpbmcgc3luYyBpbnRlcmVzdCB3aXRoCisgICAqIGludGVyZXN0IG5hbWUgd291bGQgaGF2ZSBiZWVuIHNhdGlzZmllZCBvbmNlIE5GRCBnb3QgdGhlIGRhdGEuCisgICAqCisgICAqIEZvciBlYWNoIHByZWZpeC9zZXEgaW4gZGF0YSBjb250ZW50IGNoZWNrIHRoYXQgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIHRoZQorICAgKiBwcmVmaXgvc2VxIGFuZCB1cGRhdGVTZXEocHJlZml4LCBzZXEpCisgICAqCisgICAqIE5vdGlmeSB0aGUgYXBwbGljYXRpb24gYWJvdXQgdGhlIHVwZGF0ZXMKKyAgICogc2VuZFN5bmNJbnRlcmVzdCBiZWNhdXNlIHRoZSBsYXN0IG9uZSB3YXMgc2F0aXNmaWVkIGJ5IHRoZSBpbmNvbWluZyBkYXRhCisgICAqCisgICAqIEBwYXJhbSBpbnRlcmVzdCBpbnRlcmVzdCBmb3Igd2hpY2ggd2UgZ290IHRoZSBkYXRhCisgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHBhY2tldCB3ZSBnb3QKKyAgICovCisgIHZvaWQKKyAgb25TeW5jRGF0YShjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCwgY29uc3QgbmRuOjpEYXRhJiBkYXRhKTsKKworICAvKioKKyAgICogQGJyaWVmIFNhdGlzZnkgcGVuZGluZyBzeW5jIGludGVyZXN0cworICAgKgorICAgKiBGb3IgcGVuZGluZyBzeW5jIGludGVyZXN0cyBTSSwgaWYgSUJGIG9mIFNJIGhhcyBhbnkgZGlmZmVyZW5jZSBmcm9tIG91ciBvd24gSUJGOgorICAgKiBzZW5kIGRhdGEgYmFjay4KKyAgICogSWYgd2UgY2FuJ3QgZGVjb2RlIGRpZmZlcmVuY2VzIGZyb20gdGhlIHN0b3JlZCBJQkYsIHRoZW4gZGVsZXRlIGl0LgorICAgKi8KKyAgdm9pZAorICBzYXRpc2Z5UGVuZGluZ0ludGVyZXN0cygpOworCisgIC8qKgorICAgKiBAYnJpZWYgRGVsZXRlIHBlbmRpbmcgc3luYyBpbnRlcmVzdHMgdGhhdCBtYXRjaCBnaXZlbiBuYW1lCisgICAqCisgICAqLworICB2b2lkCisgIGRlbGV0ZVBlbmRpbmdJbnRlcmVzdHMoY29uc3QgbmRuOjpOYW1lJiBpbnRlcmVzdE5hbWUpOworCisgICAvKioKKyAgICogQGJyaWVmIENoZWNrIGlmIGhhc2gocHJlZml4ICsgMSkgaXMgaW4gbmVnYXRpdmUKKyAgICoKKyAgICogU29tZXRpbWVzIHdoYXQgaGFwcGVucyBpcyB0aGF0IGludGVyZXN0IGZyb20gb3RoZXIgc2lkZQorICAgKiBnZXRzIHRvIHVzIGJlZm9yZSB0aGUgZGF0YQorICAgKi8KKyAgYm9vbAorICBpc0Z1dHVyZUhhc2goY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgsIGNvbnN0IHN0ZDo6c2V0PHVpbnQzMl90PiYgbmVnYXRpdmUpOworCisgIC8qKgorICAgKiBAYnJpZWYgU2VnbWVudCBhbmQgc2VuZCBzdGF0ZSB3aXRoIHRoZSBnaXZlbiBkYXRhIG5hbWUKKyAgICoKKyAgICovCisgIHZvaWQKKyAgc2VuZFJlY292ZXJ5RGF0YShjb25zdCBuZG46Ok5hbWUmIHByZWZpeCwgY29uc3QgU3RhdGUmIHN0YXRlKTsKKworICAvKioKKyAgICogQGJyaWVmIFNlbmQgcmVjb3ZlcnkgaW50ZXJlc3QgdXNpbmcgc2VnbWVudCBmZXRjaGVyCisgICAqCisgICAqIFJlY292ZXJ5IGRhdGEgaXMgZXhwZWN0ZWQgZ28gb3ZlciBtYXggcGFja2V0IHNpemUKKyAgICogQXBwZW5kcyB0aGUgUkVDT1ZFUllfUFJFRklYIHRvIHRoZSBnaXZlbiBpbnRlcmVzdAorICAgKi8KKyAgdm9pZAorICBzZW5kUmVjb3ZlcnlJbnRlcmVzdChjb25zdCBuZG46OkludGVyZXN0JiBpbnRlcmVzdCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6bWFwIDxuZG46Ok5hbWUsIFBlbmRpbmdFbnRyeUluZm9GdWxsPiBtX3BlbmRpbmdFbnRyaWVzOworCisgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIG1fc3luY0ludGVyZXN0TGlmZXRpbWU7CisKKyAgVXBkYXRlQ2FsbGJhY2sgbV9vblVwZGF0ZTsKKworICBjb25zdCBuZG46OlBlbmRpbmdJbnRlcmVzdElkKiBtX291dHN0YW5kaW5nSW50ZXJlc3RJZDsKKworICBuZG46OnV0aWw6OnNjaGVkdWxlcjo6U2NvcGVkRXZlbnRJZCBtX3NjaGVkdWxlZFN5bmNJbnRlcmVzdElkOworCisgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPD4gbV9qaXR0ZXI7CisKKyAgbmRuOjpOYW1lIG1fb3V0c3RhbmRpbmdJbnRlcmVzdE5hbWU7CisKKyAgY29uc3QgbmRuOjpSZWdpc3RlcmVkUHJlZml4SWQqIG1fcmVnaXN0ZXJQcmVmaXhJZDsKK307CisKK30gLy8gbmFtZXNwYWNlIHBzeW5jCisKKyNlbmRpZiAvLyBQU1lOQ19GVUxMX1BST0RVQ0VSX0hQUApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9wYXJ0aWFsLXByb2R1Y2VyLmNwcCBiL3NyYy9wYXJ0aWFsLXByb2R1Y2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2ZiNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BhcnRpYWwtcHJvZHVjZXIuY3BwCkBAIC0wLDAgKzEsMjUyIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFBTeW5jLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgUFN5bmMgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIFBTeW5jIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFBTeW5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIFBTeW5jLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJwYXJ0aWFsLXByb2R1Y2VyLmhwcCIKKyNpbmNsdWRlICJkZXRhaWwvc3RhdGUuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2xvZ2dlci5ocHA+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIHBzeW5jIHsKKworTkROX0xPR19JTklUKHBzeW5jLlBhcnRpYWxQcm9kdWNlcik7CisKK1BhcnRpYWxQcm9kdWNlcjo6UGFydGlhbFByb2R1Y2VyKHNpemVfdCBleHBlY3RlZE51bUVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OkZhY2UmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZG46Ok5hbWUmIHN5bmNQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZG46Ok5hbWUmIHVzZXJQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBzeW5jUmVwbHlGcmVzaG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBoZWxsb1JlcGx5RnJlc2huZXNzKQorIDogUHJvZHVjZXJCYXNlKGV4cGVjdGVkTnVtRW50cmllcywgZmFjZSwgc3luY1ByZWZpeCwKKyAgICAgICAgICAgICAgICB1c2VyUHJlZml4LCBzeW5jUmVwbHlGcmVzaG5lc3MsIGhlbGxvUmVwbHlGcmVzaG5lc3MpCit7CisgIG1fcmVnaXN0ZXJQcmVmaXhJZCA9CisgICAgbV9mYWNlLnJlZ2lzdGVyUHJlZml4KG1fc3luY1ByZWZpeCwKKyAgICAgIFt0aGlzXSAoY29uc3QgbmRuOjpOYW1lJiBzeW5jUHJlZml4KSB7CisgICAgICAgIG1fZmFjZS5zZXRJbnRlcmVzdEZpbHRlcihuZG46Ok5hbWUobV9zeW5jUHJlZml4KS5hcHBlbmQoImhlbGxvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJlBhcnRpYWxQcm9kdWNlcjo6b25IZWxsb0ludGVyZXN0LCB0aGlzLCBfMSwgXzIpKTsKKworICAgICAgICBtX2ZhY2Uuc2V0SW50ZXJlc3RGaWx0ZXIobmRuOjpOYW1lKG1fc3luY1ByZWZpeCkuYXBwZW5kKCJzeW5jIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJlBhcnRpYWxQcm9kdWNlcjo6b25TeW5jSW50ZXJlc3QsIHRoaXMsIF8xLCBfMikpOworICAgICAgfSwKKyAgICAgIHN0ZDo6YmluZCgmUGFydGlhbFByb2R1Y2VyOjpvblJlZ2lzdGVyRmFpbGVkLCB0aGlzLCBfMSwgXzIpKTsKK30KKworUGFydGlhbFByb2R1Y2VyOjp+UGFydGlhbFByb2R1Y2VyKCkKK3sKKyAgbV9mYWNlLnVucmVnaXN0ZXJQcmVmaXgobV9yZWdpc3RlclByZWZpeElkLCBudWxscHRyLCBudWxscHRyKTsKK30KKwordm9pZAorUGFydGlhbFByb2R1Y2VyOjpwdWJsaXNoTmFtZShjb25zdCBuZG46Ok5hbWUmIHByZWZpeCwgbmRuOjpvcHRpb25hbDx1aW50NjRfdD4gc2VxKQoreworICBpZiAobV9wcmVmaXhlcy5maW5kKHByZWZpeCkgPT0gbV9wcmVmaXhlcy5lbmQoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHVpbnQ2NF90IG5ld1NlcSA9IHNlcS52YWx1ZV9vcihtX3ByZWZpeGVzW3ByZWZpeF0gKyAxKTsKKworICBORE5fTE9HX0lORk8oIlB1Ymxpc2g6ICIgPDwgcHJlZml4IDw8ICIvIiA8PCBuZXdTZXEpOworCisgIHVwZGF0ZVNlcU5vKHByZWZpeCwgbmV3U2VxKTsKKworICBzYXRpc2Z5UGVuZGluZ1N5bmNJbnRlcmVzdHMocHJlZml4KTsKK30KKwordm9pZAorUGFydGlhbFByb2R1Y2VyOjpvbkhlbGxvSW50ZXJlc3QoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgsIGNvbnN0IG5kbjo6SW50ZXJlc3QmIGludGVyZXN0KQoreworICBORE5fTE9HX0RFQlVHKCJIZWxsbyBJbnRlcmVzdCBSZWNlaXZlZCwgbm9uY2U6ICIgPDwgaW50ZXJlc3QuZ2V0Tm9uY2UoKSk7CisKKyAgU3RhdGUgc3RhdGU7CisKKyAgZm9yIChjb25zdCBhdXRvJiBwIDogbV9wcmVmaXhlcykgeworICAgIHN0YXRlLmFkZENvbnRlbnQocC5maXJzdCk7CisgIH0KKyAgTkROX0xPR19ERUJVRygic2VuZGluZyBjb250ZW50IHA6ICIgPDwgc3RhdGUpOworCisgIG5kbjo6TmFtZSBoZWxsb0RhdGFOYW1lID0gcHJlZml4OworICBtX2libHQuYXBwZW5kVG9OYW1lKGhlbGxvRGF0YU5hbWUpOworCisgIG5kbjo6RGF0YSBkYXRhOworICBkYXRhLnNldE5hbWUoaGVsbG9EYXRhTmFtZSk7CisgIGRhdGEuc2V0RnJlc2huZXNzUGVyaW9kKG1faGVsbG9SZXBseUZyZXNobmVzcyk7CisgIGRhdGEuc2V0Q29udGVudChzdGF0ZS53aXJlRW5jb2RlKCkpOworCisgIG1fa2V5Q2hhaW4uc2lnbihkYXRhKTsKKyAgbV9mYWNlLnB1dChkYXRhKTsKK30KKwordm9pZAorUGFydGlhbFByb2R1Y2VyOjpvblN5bmNJbnRlcmVzdChjb25zdCBuZG46Ok5hbWUmIHByZWZpeCwgY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QpCit7CisgIE5ETl9MT0dfREVCVUcoIlN5bmMgSW50ZXJlc3QgUmVjZWl2ZWQsIG5vbmNlOiAiIDw8IGludGVyZXN0LmdldE5vbmNlKCkgPDwKKyAgICAgICAgICAgICAgICAiIGhhc2g6ICIgPDwgc3RkOjpoYXNoPHN0ZDo6c3RyaW5nPnt9KGludGVyZXN0LmdldE5hbWUoKS50b1VyaSgpKSk7CisKKyAgbmRuOjpOYW1lIGludGVyZXN0TmFtZSA9IGludGVyZXN0LmdldE5hbWUoKTsKKworICBuZG46Om5hbWU6OkNvbXBvbmVudCBiZk5hbWUsIGlibHROYW1lOworICB1bnNpZ25lZCBpbnQgcHJvamVjdGVkQ291bnQ7CisgIGRvdWJsZSBmYWxzZVBvc2l0aXZlUHJvYjsKKyAgdHJ5IHsKKyAgICBwcm9qZWN0ZWRDb3VudCA9IGludGVyZXN0TmFtZS5nZXQoaW50ZXJlc3ROYW1lLnNpemUoKS00KS50b051bWJlcigpOworICAgIGZhbHNlUG9zaXRpdmVQcm9iID0gaW50ZXJlc3ROYW1lLmdldChpbnRlcmVzdE5hbWUuc2l6ZSgpLTMpLnRvTnVtYmVyKCkvMTAwMC47CisgICAgYmZOYW1lID0gaW50ZXJlc3ROYW1lLmdldChpbnRlcmVzdE5hbWUuc2l6ZSgpLTIpOworCisgICAgaWJsdE5hbWUgPSBpbnRlcmVzdE5hbWUuZ2V0KGludGVyZXN0TmFtZS5zaXplKCktMSk7CisgIH0KKyAgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgTkROX0xPR19FUlJPUigiQ2Fubm90IGV4dHJhY3QgYmxvb20gZmlsdGVyIGFuZCBJQkYgZnJvbSBzeW5jIGludGVyZXN0OiAiIDw8IGUud2hhdCgpKTsKKyAgICBORE5fTE9HX0VSUk9SKCJGb3JtYXQ6IC88c3luY1ByZWZpeD4vc3luYy88QkYtY291bnQ+LzxCRi1mYWxzZS1wb3NpdGl2ZS1wcm9iYWJpbGl0eT4vPEJGPi88SUJGPiIpOworICAgIHJldHVybjsKKyAgfQorCisgIEJsb29tRmlsdGVyIGJmOworICBJQkxUIGlibHQobV9leHBlY3RlZE51bUVudHJpZXMpOworCisgIHRyeSB7CisgICAgYmYgPSBCbG9vbUZpbHRlcihwcm9qZWN0ZWRDb3VudCwgZmFsc2VQb3NpdGl2ZVByb2IsIGJmTmFtZSk7CisgICAgaWJsdC5pbml0aWFsaXplKGlibHROYW1lKTsKKyAgfQorICBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICBORE5fTE9HX1dBUk4oZS53aGF0KCkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGdldCB0aGUgZGlmZmVyZW5jZQorICBJQkxUIGRpZmYgPSBtX2libHQgLSBpYmx0OworCisgIC8vIG5vbi1lbXB0eSBwb3NpdGl2ZSBtZWFucyB3ZSBoYXZlIHNvbWUgZWxlbWVudHMgdGhhdCB0aGUgb3RoZXJzIGRvbid0CisgIHN0ZDo6c2V0PHVpbnQzMl90PiBwb3NpdGl2ZTsKKyAgc3RkOjpzZXQ8dWludDMyX3Q+IG5lZ2F0aXZlOworCisgIE5ETl9MT0dfVFJBQ0UoIk51bWJlciBlbGVtZW50cyBpbiBJQkY6ICIgPDwgbV9wcmVmaXhlcy5zaXplKCkpOworCisgIGJvb2wgcGVlbCA9IGRpZmYubGlzdEVudHJpZXMocG9zaXRpdmUsIG5lZ2F0aXZlKTsKKworICBORE5fTE9HX1RSQUNFKCJSZXN1bHQgb2YgbGlzdEVudHJpZXMgb24gdGhlIGRpZmZlcmVuY2U6ICIgPDwgcGVlbCk7CisKKyAgaWYgKCFwZWVsKSB7CisgICAgTkROX0xPR19ERUJVRygiQ2FuJ3QgZGVjb2RlIHRoZSBkaWZmZXJlbmNlLCBzZW5kaW5nIGFwcGxpY2F0aW9uIE5hY2siKTsKKyAgICBzZW5kQXBwbGljYXRpb25OYWNrKGludGVyZXN0TmFtZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZ2VuZXJhdGUgY29udGVudCBmb3IgU3luYyByZXBseQorICBTdGF0ZSBzdGF0ZTsKKyAgTkROX0xPR19UUkFDRSgiU2l6ZSBvZiBwb3NpdGl2ZSBzZXQgIiA8PCBwb3NpdGl2ZS5zaXplKCkpOworICBORE5fTE9HX1RSQUNFKCJTaXplIG9mIG5lZ2F0aXZlIHNldCAiIDw8IG5lZ2F0aXZlLnNpemUoKSk7CisgIGZvciAoY29uc3QgYXV0byYgaGFzaCA6IHBvc2l0aXZlKSB7CisgICAgbmRuOjpOYW1lIHByZWZpeCA9IG1faGFzaDJwcmVmaXhbaGFzaF07CisgICAgaWYgKGJmLmNvbnRhaW5zKHByZWZpeC50b1VyaSgpKSkgeworICAgICAgLy8gZ2VuZXJhdGUgZGF0YQorICAgICAgc3RhdGUuYWRkQ29udGVudChuZG46Ok5hbWUocHJlZml4KS5hcHBlbmROdW1iZXIobV9wcmVmaXhlc1twcmVmaXhdKSk7CisgICAgICBORE5fTE9HX0RFQlVHKCJDb250ZW50OiAiIDw8IHByZWZpeCA8PCAiICIgPDwgc3RkOjp0b19zdHJpbmcobV9wcmVmaXhlc1twcmVmaXhdKSk7CisgICAgfQorICB9CisKKyAgTkROX0xPR19UUkFDRSgibV90aHJlc2hvbGQ6ICIgPDwgbV90aHJlc2hvbGQgPDwgIiBUb3RhbDogIiA8PCBwb3NpdGl2ZS5zaXplKCkgKyBuZWdhdGl2ZS5zaXplKCkpOworCisgIGlmIChwb3NpdGl2ZS5zaXplKCkgKyBuZWdhdGl2ZS5zaXplKCkgPj0gbV90aHJlc2hvbGQgfHwgIXN0YXRlLmdldENvbnRlbnQoKS5lbXB0eSgpKSB7CisKKyAgICAvLyBzZW5kIGJhY2sgZGF0YQorICAgIG5kbjo6TmFtZSBzeW5jRGF0YU5hbWUgPSBpbnRlcmVzdE5hbWU7CisgICAgbV9pYmx0LmFwcGVuZFRvTmFtZShzeW5jRGF0YU5hbWUpOworICAgIG5kbjo6RGF0YSBkYXRhOworICAgIGRhdGEuc2V0TmFtZShzeW5jRGF0YU5hbWUpOworICAgIGRhdGEuc2V0RnJlc2huZXNzUGVyaW9kKG1fc3luY1JlcGx5RnJlc2huZXNzKTsKKyAgICBkYXRhLnNldENvbnRlbnQoc3RhdGUud2lyZUVuY29kZSgpKTsKKworICAgIG1fa2V5Q2hhaW4uc2lnbihkYXRhKTsKKyAgICBORE5fTE9HX0RFQlVHKCJTZW5kaW5nIHN5bmMgZGF0YSIpOworICAgIG1fZmFjZS5wdXQoZGF0YSk7CisKKyAgICByZXR1cm47CisgIH0KKworICBuZG46OnV0aWw6OnNjaGVkdWxlcjo6U2NvcGVkRXZlbnRJZCBzY29wZWRFdmVudElkKG1fc2NoZWR1bGVyKTsKKyAgYXV0byBpdCA9IG1fcGVuZGluZ0VudHJpZXMuZW1wbGFjZShpbnRlcmVzdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0VudHJ5SW5mb3tiZiwgaWJsdCwgc3RkOjptb3ZlKHNjb3BlZEV2ZW50SWQpfSk7CisKKyAgaXQuZmlyc3QtPnNlY29uZC5leHBpcmF0aW9uRXZlbnQgPQorICAgIG1fc2NoZWR1bGVyLnNjaGVkdWxlRXZlbnQoaW50ZXJlc3QuZ2V0SW50ZXJlc3RMaWZldGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMsIGludGVyZXN0XSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ETl9MT0dfVFJBQ0UoIkVyYXNlIFBlbmRpbmcgSW50ZXJlc3QgIiA8PCBpbnRlcmVzdC5nZXROb25jZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wZW5kaW5nRW50cmllcy5lcmFzZShpbnRlcmVzdC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKK3ZvaWQKK1BhcnRpYWxQcm9kdWNlcjo6c2F0aXNmeVBlbmRpbmdTeW5jSW50ZXJlc3RzKGNvbnN0IG5kbjo6TmFtZSYgcHJlZml4KSB7CisgIE5ETl9MT0dfVFJBQ0UoInNpemUgb2YgcGVuZGluZyBpbnRlcmVzdDogIiA8PCBtX3BlbmRpbmdFbnRyaWVzLnNpemUoKSk7CisKKyAgZm9yIChhdXRvIGl0ID0gbV9wZW5kaW5nRW50cmllcy5iZWdpbigpOyBpdCAhPSBtX3BlbmRpbmdFbnRyaWVzLmVuZCgpOykgeworICAgIGNvbnN0IFBlbmRpbmdFbnRyeUluZm8mIGVudHJ5ID0gaXQtPnNlY29uZDsKKworICAgIElCTFQgZGlmZiA9IG1faWJsdCAtIGVudHJ5LmlibHQ7CisgICAgc3RkOjpzZXQ8dWludDMyX3Q+IHBvc2l0aXZlOworICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBuZWdhdGl2ZTsKKworICAgIGJvb2wgcGVlbCA9IGRpZmYubGlzdEVudHJpZXMocG9zaXRpdmUsIG5lZ2F0aXZlKTsKKworICAgIE5ETl9MT0dfVFJBQ0UoIlJlc3VsdCBvZiBsaXN0RW50cmllcyBvbiB0aGUgZGlmZmVyZW5jZTogIiA8PCBwZWVsKTsKKworICAgIE5ETl9MT0dfVFJBQ0UoIk51bWJlciBlbGVtZW50cyBpbiBJQkY6ICIgPDwgbV9wcmVmaXhlcy5zaXplKCkpOworICAgIE5ETl9MT0dfVFJBQ0UoIm1fdGhyZXNob2xkOiAiIDw8IG1fdGhyZXNob2xkIDw8ICIgVG90YWw6ICIgPDwgcG9zaXRpdmUuc2l6ZSgpICsgbmVnYXRpdmUuc2l6ZSgpKTsKKworICAgIGlmICghcGVlbCkgeworICAgICAgTkROX0xPR19UUkFDRSgiRGVjb2Rpbmcgb2YgZGlmZmVyZW5jZXMgd2l0aCBzdG9yZWQgSUJGIHVuc3VjY2Vzc2Z1bCwgZGVsZXRpbmcgcGVuZGluZyBpbnRlcmVzdCIpOworICAgICAgbV9wZW5kaW5nRW50cmllcy5lcmFzZShpdCsrKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFN0YXRlIHN0YXRlOworICAgIGlmIChlbnRyeS5iZi5jb250YWlucyhwcmVmaXgudG9VcmkoKSkgfHwgcG9zaXRpdmUuc2l6ZSgpICsgbmVnYXRpdmUuc2l6ZSgpID49IG1fdGhyZXNob2xkKSB7CisgICAgICBpZiAoZW50cnkuYmYuY29udGFpbnMocHJlZml4LnRvVXJpKCkpKSB7CisgICAgICAgICBzdGF0ZS5hZGRDb250ZW50KG5kbjo6TmFtZShwcmVmaXgpLmFwcGVuZE51bWJlcihtX3ByZWZpeGVzW3ByZWZpeF0pKTsKKyAgICAgICAgIE5ETl9MT0dfREVCVUcoInNlbmRpbmcgc3luYyBjb250ZW50ICIgPDwgcHJlZml4IDw8ICIgIiA8PCBzdGQ6OnRvX3N0cmluZyhtX3ByZWZpeGVzW3ByZWZpeF0pKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBORE5fTE9HX0RFQlVHKCJTZW5kaW5nIHdpdGggZW1wdHkgY29udGVudCB0byBzZW5kIGxhdGVzdCBJQkYgdG8gY29uc3VtZXIiKTsKKyAgICAgIH0KKworICAgICAgLy8gZ2VuZXJhdGUgc3luYyBkYXRhIGFuZCBjYW5jZWwgdGhlIGV2ZW50CisgICAgICBuZG46Ok5hbWUgc3luY0RhdGFOYW1lID0gaXQtPmZpcnN0OworICAgICAgbV9pYmx0LmFwcGVuZFRvTmFtZShzeW5jRGF0YU5hbWUpOworICAgICAgbmRuOjpEYXRhIGRhdGE7CisgICAgICBkYXRhLnNldE5hbWUoc3luY0RhdGFOYW1lKTsKKyAgICAgIGRhdGEuc2V0RnJlc2huZXNzUGVyaW9kKG1fc3luY1JlcGx5RnJlc2huZXNzKTsKKyAgICAgIGRhdGEuc2V0Q29udGVudChzdGF0ZS53aXJlRW5jb2RlKCkpOworCisgICAgICBtX2tleUNoYWluLnNpZ24oZGF0YSk7CisgICAgICBORE5fTE9HX0RFQlVHKCJTZW5kaW5nIHN5bmMgZGF0YSIpOworICAgICAgbV9mYWNlLnB1dChkYXRhKTsKKworICAgICAgbV9wZW5kaW5nRW50cmllcy5lcmFzZShpdCsrKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICArK2l0OworICAgIH0KKyAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBwc3luYwpkaWZmIC0tZ2l0IGEvc3JjL3BhcnRpYWwtcHJvZHVjZXIuaHBwIGIvc3JjL3BhcnRpYWwtcHJvZHVjZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZGI3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGFydGlhbC1wcm9kdWNlci5ocHAKQEAgLTAsMCArMSwxMjggQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgUFN5bmMuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBQU3luYyBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogUFN5bmMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogUFN5bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogUFN5bmMsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2lmbmRlZiBQU1lOQ19QQVJUSUFMX1BST0RVQ0VSX0hQUAorI2RlZmluZSBQU1lOQ19QQVJUSUFMX1BST0RVQ0VSX0hQUAorCisjaW5jbHVkZSAiZGV0YWlsL2Jsb29tLWZpbHRlci5ocHAiCisjaW5jbHVkZSAicHJvZHVjZXItYmFzZS5ocHAiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgPG5kbi1jeHgvZmFjZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL3NjaGVkdWxlci5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL3NjaGVkdWxlci1zY29wZWQtZXZlbnQtaWQuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC90aW1lLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L2tleS1jaGFpbi5ocHA+CisKK25hbWVzcGFjZSBwc3luYyB7CisKK3N0cnVjdCBQZW5kaW5nRW50cnlJbmZvCit7CisgIEJsb29tRmlsdGVyIGJmOworICBJQkxUIGlibHQ7CisgIG5kbjo6dXRpbDo6c2NoZWR1bGVyOjpTY29wZWRFdmVudElkIGV4cGlyYXRpb25FdmVudDsKK307CisKKy8qKgorICogQGJyaWVmIFBhcnRpYWwgc3luYyBsb2dpYyB0byBwdWJsaXNoIGRhdGEgbmFtZXMKKyAqCisgKiBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCBwdWJsaXNoTmFtZSB3aGVuZXZlciBpdCB3YW50cyB0bworICogbGV0IGNvbnN1bWVycyBrbm93IHRoYXQgbmV3IGRhdGEgaXMgYXZhaWxhYmxlLgorICogQWRkaXRpb25hbCB1c2VyUHJlZml4IHNob3VsZCBiZSBhZGRlZCB2aWEgYWRkVXNlck5vZGUgYmVmb3JlIGNhbGxpbmcgcHVibGlzaE5hbWUKKyAqIEN1cnJlbnRseSwgcHVibGlzaGluZyBvZiBkYXRhIG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICovCitjbGFzcyBQYXJ0aWFsUHJvZHVjZXIgOiBwdWJsaWMgUHJvZHVjZXJCYXNlCit7CitwdWJsaWM6CisgIC8qKgorICAgKiBAYnJpZWYgY29uc3RydWN0b3IKKyAgICoKKyAgICogUmVnaXN0ZXJzIHN5bmNQcmVmaXggaW4gTkZEIGFuZCBzZXRzIGludGVybmFsIGZpbHRlcnMgZm9yCisgICAqICJzeW5jIiBhbmQgImhlbGxvIiB1bmRlciBzeW5jUHJlZml4CisgICAqCisgICAqIEBwYXJhbSBleHBlY3RlZE51bUVudHJpZXMgZXhwZWN0ZWQgZW50cmllcyBpbiBJQkYKKyAgICogQHBhcmFtIGZhY2UgYXBwbGljYXRpb24ncyBmYWNlCisgICAqIEBwYXJhbSBzeW5jUHJlZml4IFRoZSBwcmVmaXggb2YgdGhlIHN5bmMgZ3JvdXAKKyAgICogQHBhcmFtIHVzZXJQcmVmaXggVGhlIHByZWZpeCBvZiB0aGUgZmlyc3QgdXNlciBpbiB0aGUgZ3JvdXAKKyAgICogQHBhcmFtIHN5bmNSZXBseUZyZXNobmVzcyBmcmVzaG5lc3Mgb2Ygc3luYyBkYXRhCisgICAqIEBwYXJhbSBoZWxsb1JlcGx5RnJlc2huZXNzIGZyZXNobmVzcyBvZiBoZWxsbyBkYXRhCisgICAqLworICBQYXJ0aWFsUHJvZHVjZXIoc2l6ZV90IGV4cGVjdGVkTnVtRW50cmllcywKKyAgICAgICAgICAgICAgICAgIG5kbjo6RmFjZSYgZmFjZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6TmFtZSYgc3luY1ByZWZpeCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6TmFtZSYgdXNlclByZWZpeCwKKyAgICAgICAgICAgICAgICAgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIGhlbGxvUmVwbHlGcmVzaG5lc3MgPSBIRUxMT19SRVBMWV9GUkVTSE5FU1MsCisgICAgICAgICAgICAgICAgICBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBzeW5jUmVwbHlGcmVzaG5lc3MgPSBTWU5DX1JFUExZX0ZSRVNITkVTUyk7CisKKyAgflBhcnRpYWxQcm9kdWNlcigpOworCisgIC8qKgorICAgKiBAYnJpZWYgUHVibGlzaCBuYW1lIHRvIGxldCBzdWJzY3JpYmVkIGNvbnN1bWVycyBrbm93CisgICAqCisgICAqIElmIHNlcSBpcyBudWxsIHRoZW4gdGhlIHNlcSBvZiBwcmVmaXggaXMgaW5jcmVtZW50ZWQgYnkgMSBlbHNlCisgICAqIHRoZSBzdXBwbGllZCBzZXF1ZW5jZSBpcyBzZXQgaW4gdGhlIElCRi4KKyAgICogVXBvbiB1cGRhdGluZyB0aGUgc2VxdWVuY2UgaW4gdGhlIElCRiBzYXRpc2Z5UGVuZGluZ1N5bmNJbnRlcmVzdHMKKyAgICogaXMgY2FsbGVkIHRvIGxldCBzdWJzY3JpYmVkIGNvbnN1bWVycyBrbm93LgorICAgKgorICAgKiBAcGFyYW0gcHJlZml4IHRoZSBwcmVmaXggdG8gYmUgdXBkYXRlZAorICAgKiBAcGFyYW0gc2VxIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHByZWZpeAorICAgKi8KKyAgdm9pZAorICBwdWJsaXNoTmFtZShjb25zdCBuZG46Ok5hbWUmIHByZWZpeCwgbmRuOjpvcHRpb25hbDx1aW50NjRfdD4gc2VxID0gbmRuOjpudWxsb3B0KTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEBicmllZiBTYXRpc2Z5IGFueSBwZW5kaW5nIGludGVyZXN0IHRoYXQgaGF2ZSBzdWJzY3JpcHRpb24gZm9yIHByZWZpeAorICAgKgorICAgKiBAcGFyYW0gcHJlZml4IHRoZSBwcmVmaXggdGhhdCB3YXMgdXBkYXRlZCBpbiBwdWJsaXNoTmFtZQorICAgKi8KKyAgdm9pZAorICBzYXRpc2Z5UGVuZGluZ1N5bmNJbnRlcmVzdHMoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgpOworCisgIC8qKgorICAgKiBAYnJpZWYgUmVjZWl2ZSBoZWxsbyBpbnRlcmVzdCBmcm9tIGNvbnN1bWVyIGFuZCByZXNwb25kIHdpdGggaGVsbG8gZGF0YQorICAgKgorICAgKiBIZWxsbyBkYXRhJ3MgbmFtZSBmb3JtYXQgaXM6IC9cPHN5bmMtcHJlZml4XD4vaGVsbG8vXDxjdXJyZW50LUlCRlw+CisgICAqLworICB2b2lkCisgIG9uSGVsbG9JbnRlcmVzdChjb25zdCBuZG46Ok5hbWUmIHByZWZpeCwgY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QpOworCitQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BSSVZBVEU6CisgIC8qKgorICAgKiBAYnJpZWYgUmVjZWl2ZSBzeW5jIGludGVyZXN0IGZyb20gY29uc3VtZXIKKyAgICoKKyAgICogRWl0aGVyIHJlc3BvbmQgd2l0aCBzeW5jIGRhdGEgaWYgY29uc3VtZXIgaXMgYmVoaW5kIG9yCisgICAqIHN0b3JlIHN5bmMgaW50ZXJlc3QgaW4gbV9wZW5kaW5nRW50cmllcworICAgKgorICAgKiBTeW5jIGRhdGEncyBuYW1lIGZvcm1hdCBpczogL1w8c3luYy1wcmVmaXhcPi9zeW5jL1w8b2xkLUlCRlw+L1w8Y3VycmVudC1JQkZcPgorICAgKi8KKyAgdm9pZAorICBvblN5bmNJbnRlcmVzdChjb25zdCBuZG46Ok5hbWUmIHByZWZpeCwgY29uc3QgbmRuOjpJbnRlcmVzdCYgaW50ZXJlc3QpOworCitQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BSSVZBVEU6CisgIHN0ZDo6bWFwIDxuZG46Ok5hbWUsIFBlbmRpbmdFbnRyeUluZm8+IG1fcGVuZGluZ0VudHJpZXM7CisKKyAgY29uc3QgbmRuOjpSZWdpc3RlcmVkUHJlZml4SWQqIG1fcmVnaXN0ZXJQcmVmaXhJZDsKK307CisKK30gLy8gbmFtZXNwYWNlIHBzeW5jCisKKyNlbmRpZiAvLyBQU1lOQ19QQVJUSUFMX1BST0RVQ0VSX0hQUApkaWZmIC0tZ2l0IGEvc3JjL3Byb2R1Y2VyLWJhc2UuY3BwIGIvc3JjL3Byb2R1Y2VyLWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGZiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJvZHVjZXItYmFzZS5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgUFN5bmMuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBQU3luYyBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogUFN5bmMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogUFN5bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogUFN5bmMsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgInByb2R1Y2VyLWJhc2UuaHBwIgorCisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2xvZ2dlci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgcHN5bmMgeworCitORE5fTE9HX0lOSVQocHN5bmMuUHJvZHVjZXJCYXNlKTsKKworUHJvZHVjZXJCYXNlOjpQcm9kdWNlckJhc2Uoc2l6ZV90IGV4cGVjdGVkTnVtRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6RmFjZSYgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6TmFtZSYgc3luY1ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6TmFtZSYgdXNlclByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIHN5bmNSZXBseUZyZXNobmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIGhlbGxvUmVwbHlGcmVzaG5lc3MpCisgIDogbV9pYmx0KGV4cGVjdGVkTnVtRW50cmllcykKKyAgLCBtX2V4cGVjdGVkTnVtRW50cmllcyhleHBlY3RlZE51bUVudHJpZXMpCisgICwgbV90aHJlc2hvbGQoZXhwZWN0ZWROdW1FbnRyaWVzLzIpCisgICwgbV9mYWNlKGZhY2UpCisgICwgbV9zY2hlZHVsZXIobV9mYWNlLmdldElvU2VydmljZSgpKQorICAsIG1fc3luY1ByZWZpeChzeW5jUHJlZml4KQorICAsIG1fdXNlclByZWZpeCh1c2VyUHJlZml4KQorICAsIG1fc3luY1JlcGx5RnJlc2huZXNzKHN5bmNSZXBseUZyZXNobmVzcykKKyAgLCBtX2hlbGxvUmVwbHlGcmVzaG5lc3MoaGVsbG9SZXBseUZyZXNobmVzcykKK3sKKyAgYWRkVXNlck5vZGUodXNlclByZWZpeCk7Cit9CisKK2Jvb2wKK1Byb2R1Y2VyQmFzZTo6YWRkVXNlck5vZGUoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgpCit7CisgIGlmIChtX3ByZWZpeGVzLmZpbmQocHJlZml4KSA9PSBtX3ByZWZpeGVzLmVuZCgpKSB7CisgICAgbV9wcmVmaXhlc1twcmVmaXhdID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKwordm9pZAorUHJvZHVjZXJCYXNlOjpyZW1vdmVVc2VyTm9kZShjb25zdCBuZG46Ok5hbWUmIHByZWZpeCkKK3sKKyAgYXV0byBpdCA9IG1fcHJlZml4ZXMuZmluZChwcmVmaXgpOworICBpZiAoaXQgIT0gbV9wcmVmaXhlcy5lbmQoKSkgeworICAgIHVpbnQ2NF90IHNlcU5vID0gaXQtPnNlY29uZDsKKyAgICBtX3ByZWZpeGVzLmVyYXNlKGl0KTsKKworICAgIG5kbjo6TmFtZSBwcmVmaXhXaXRoU2VxID0gbmRuOjpOYW1lKHByZWZpeCkuYXBwZW5kTnVtYmVyKHNlcU5vKTsKKyAgICBhdXRvIGhhc2hJdCA9IG1fcHJlZml4Mmhhc2guZmluZChwcmVmaXhXaXRoU2VxKTsKKyAgICBpZiAoaGFzaEl0ICE9IG1fcHJlZml4Mmhhc2guZW5kKCkpIHsKKyAgICAgIHVpbnQzMl90IGhhc2ggPSBoYXNoSXQtPnNlY29uZDsKKyAgICAgIG1fcHJlZml4Mmhhc2guZXJhc2UoaGFzaEl0KTsKKyAgICAgIG1faGFzaDJwcmVmaXguZXJhc2UoaGFzaCk7CisgICAgICBtX2libHQuZXJhc2UoaGFzaCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQKK1Byb2R1Y2VyQmFzZTo6dXBkYXRlU2VxTm8oY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgsIHVpbnQ2NF90IHNlcSkKK3sKKyAgTkROX0xPR19ERUJVRygiVXBkYXRlU2VxOiAiIDw8IHByZWZpeCA8PCAiICIgPDwgc2VxKTsKKworICB1aW50NjRfdCBvbGRTZXE7CisgIGF1dG8gaXQgPSBtX3ByZWZpeGVzLmZpbmQocHJlZml4KTsKKyAgaWYgKGl0ICE9IG1fcHJlZml4ZXMuZW5kKCkpIHsKKyAgICBvbGRTZXEgPSBpdC0+c2Vjb25kOworICB9CisgIGVsc2UgeworICAgIE5ETl9MT0dfV0FSTigiUHJlZml4IG5vdCBmb3VuZCBpbiBtX3ByZWZpeGVzIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG9sZFNlcSA+PSBzZXEpIHsKKyAgICBORE5fTE9HX1dBUk4oIlVwZGF0ZSBoYXMgbG93ZXIvZXF1YWwgc2VxIG5vIGZvciBwcmVmaXgsIGRvaW5nIG5vdGhpbmchIik7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRGVsZXRlIHRoZSBsYXN0IHNlcXVlbmNlIHByZWZpeCBmcm9tIHRoZSBpYmx0CisgIC8vIEJlY2F1c2Ugd2UgZG9uJ3QgaW5zZXJ0IHplcm90aCBwcmVmaXggaW4gSUJGIHNvIG5vIG5lZWQgdG8gZGVsZXRlIHRoYXQKKyAgaWYgKG9sZFNlcSAhPSAwKSB7CisgICAgbmRuOjpOYW1lIHByZWZpeFdpdGhTZXEgPSBuZG46Ok5hbWUocHJlZml4KS5hcHBlbmROdW1iZXIob2xkU2VxKTsKKyAgICBhdXRvIGhhc2hJdCA9IG1fcHJlZml4Mmhhc2guZmluZChwcmVmaXhXaXRoU2VxKTsKKyAgICBpZiAoaGFzaEl0ICE9IG1fcHJlZml4Mmhhc2guZW5kKCkpIHsKKyAgICAgIHVpbnQzMl90IGhhc2ggPSBoYXNoSXQtPnNlY29uZDsKKyAgICAgIG1fcHJlZml4Mmhhc2guZXJhc2UoaGFzaEl0KTsKKyAgICAgIG1faGFzaDJwcmVmaXguZXJhc2UoaGFzaCk7CisgICAgICBtX2libHQuZXJhc2UoaGFzaCk7CisgICAgfQorICB9CisKKyAgLy8gSW5zZXJ0IHRoZSBuZXcgc2VxIG5vCisgIGl0LT5zZWNvbmQgPSBzZXE7CisgIG5kbjo6TmFtZSBwcmVmaXhXaXRoU2VxID0gbmRuOjpOYW1lKHByZWZpeCkuYXBwZW5kTnVtYmVyKHNlcSk7CisgIHVpbnQzMl90IG5ld0hhc2ggPSBtdXJtdXJIYXNoMyhOX0hBU0hDSEVDSywgcHJlZml4V2l0aFNlcS50b1VyaSgpKTsKKyAgbV9wcmVmaXgyaGFzaFtwcmVmaXhXaXRoU2VxXSA9IG5ld0hhc2g7CisgIG1faGFzaDJwcmVmaXhbbmV3SGFzaF0gPSBwcmVmaXg7CisgIG1faWJsdC5pbnNlcnQobmV3SGFzaCk7Cit9CisKK3ZvaWQKK1Byb2R1Y2VyQmFzZTo6c2VuZEFwcGxpY2F0aW9uTmFjayhjb25zdCBuZG46Ok5hbWUmIG5hbWUpCit7CisgIE5ETl9MT0dfREVCVUcoIlNlbmRpbmcgYXBwbGljYXRpb24gbmFjayIpOworICBuZG46Ok5hbWUgZGF0YU5hbWUobmFtZSk7CisgIG1faWJsdC5hcHBlbmRUb05hbWUoZGF0YU5hbWUpOworCisgIG5kbjo6RGF0YSBkYXRhKGRhdGFOYW1lKTsKKyAgZGF0YS5zZXRGcmVzaG5lc3NQZXJpb2QobV9zeW5jUmVwbHlGcmVzaG5lc3MpOworICBkYXRhLnNldENvbnRlbnRUeXBlKG5kbjo6dGx2OjpDb250ZW50VHlwZV9OYWNrKTsKKyAgbV9rZXlDaGFpbi5zaWduKGRhdGEpOworICBtX2ZhY2UucHV0KGRhdGEpOworfQorCit2b2lkCitQcm9kdWNlckJhc2U6Om9uUmVnaXN0ZXJGYWlsZWQoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIGNvbnN0Cit7CisgIE5ETl9MT0dfRVJST1IoIlByb2R1ZXJCYXNlOjpvblJlZ2lzdGVyRmFpbGVkICIgPDwgcHJlZml4IDw8ICIgIiA8PCBtc2cpOworICBCT09TVF9USFJPV19FWENFUFRJT04oRXJyb3IobXNnKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHBzeW5jCmRpZmYgLS1naXQgYS9zcmMvcHJvZHVjZXItYmFzZS5ocHAgYi9zcmMvcHJvZHVjZXItYmFzZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5YjgwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm9kdWNlci1iYXNlLmhwcApAQCAtMCwwICsxLDE4OCBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBQU3luYy4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIFBTeW5jIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBQU3luYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBQU3luYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBQU3luYywgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaWZuZGVmIFBTWU5DX1BST0RVQ0VSX0JBU0VfSFBQCisjZGVmaW5lIFBTWU5DX1BST0RVQ0VSX0JBU0VfSFBQCisKKyNpbmNsdWRlICJkZXRhaWwvaWJsdC5ocHAiCisjaW5jbHVkZSAiZGV0YWlsL2Jsb29tLWZpbHRlci5ocHAiCisjaW5jbHVkZSAiZGV0YWlsL3V0aWwuaHBwIgorI2luY2x1ZGUgImRldGFpbC90ZXN0LWFjY2Vzcy1jb250cm9sLmhwcCIKKworI2luY2x1ZGUgPG5kbi1jeHgvZmFjZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL3NjaGVkdWxlci5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL3RpbWUuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvc2VjdXJpdHkva2V5LWNoYWluLmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L3NlY3VyaXR5L3ZhbGlkYXRvci1jb25maWcuaHBwPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8cmFuZG9tPgorCituYW1lc3BhY2UgcHN5bmMgeworCit1c2luZyBuYW1lc3BhY2UgbmRuOjpsaXRlcmFsczo6dGltZV9saXRlcmFsczsKKworY29uc3QgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgU1lOQ19SRVBMWV9GUkVTSE5FU1MgPSAxX3M7Citjb25zdCBuZG46OnRpbWU6Om1pbGxpc2Vjb25kcyBIRUxMT19SRVBMWV9GUkVTSE5FU1MgPSAxX3M7CisKKy8qKgorICogQGJyaWVmIEJhc2UgY2xhc3MgZm9yIFBhcnRpYWxQcm9kdWNlciBhbmQgRnVsbFByb2R1Y2VyCisgKgorICogQ29udGFpbnMgY29kZSBjb21tb24gdG8gYm90aAorICovCitjbGFzcyBQcm9kdWNlckJhc2UKK3sKKyAgY2xhc3MgRXJyb3IgOiBwdWJsaWMgc3RkOjpydW50aW1lX2Vycm9yCisgIHsKKyAgcHVibGljOgorICAgIHVzaW5nIHN0ZDo6cnVudGltZV9lcnJvcjo6cnVudGltZV9lcnJvcjsKKyAgfTsKKworUFVCTElDX1dJVEhfVEVTVFNfRUxTRV9QUk9URUNURUQ6CisgIC8qKgorICAgKiBAYnJpZWYgY29uc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIGV4cGVjdGVkTnVtRW50cmllcyBleHBlY3RlZCBudW1iZXIgZW50cmllcyBpbiBJQkYKKyAgICogQHBhcmFtIGZhY2UgYXBwbGljYXRpb24ncyBmYWNlCisgICAqIEBwYXJhbSBzeW5jUHJlZml4IFRoZSBwcmVmaXggb2YgdGhlIHN5bmMgZ3JvdXAKKyAgICogQHBhcmFtIHVzZXJQcmVmaXggVGhlIHByZWZpeCBvZiB0aGUgZmlyc3QgdXNlciBpbiB0aGUgZ3JvdXAKKyAgICogQHBhcmFtIHN5bmNSZXBseUZyZXNobmVzcyBmcmVzaG5lc3Mgb2Ygc3luYyBkYXRhCisgICAqIEBwYXJhbSBoZWxsb1JlcGx5RnJlc2huZXNzIGZyZXNobmVzcyBvZiBoZWxsbyBkYXRhCisgICAqLworICBQcm9kdWNlckJhc2Uoc2l6ZV90IGV4cGVjdGVkTnVtRW50cmllcywKKyAgICAgICAgICAgICAgIG5kbjo6RmFjZSYgZmFjZSwKKyAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6TmFtZSYgc3luY1ByZWZpeCwKKyAgICAgICAgICAgICAgIGNvbnN0IG5kbjo6TmFtZSYgdXNlclByZWZpeCwKKyAgICAgICAgICAgICAgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIHN5bmNSZXBseUZyZXNobmVzcyA9IFNZTkNfUkVQTFlfRlJFU0hORVNTLAorICAgICAgICAgICAgICAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgaGVsbG9SZXBseUZyZXNobmVzcyA9IEhFTExPX1JFUExZX0ZSRVNITkVTUyk7CitwdWJsaWM6CisgIC8qKgorICAgKiBAYnJpZWYgUmV0dXJucyB0aGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGdpdmVuIHByZWZpeAorICAgKgorICAgKiBAcGFyYW0gcHJlZml4IHByZWZpeCB0byBnZXQgdGhlIHNlcXVlbmNlIG51bWJlciBvZgorICAgKi8KKyAgbmRuOjpvcHRpb25hbDx1aW50NjRfdD4KKyAgZ2V0U2VxTm8oY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgpIGNvbnN0CisgIHsKKyAgICBhdXRvIGl0ID0gbV9wcmVmaXhlcy5maW5kKHByZWZpeCk7CisgICAgaWYgKGl0ID09IG1fcHJlZml4ZXMuZW5kKCkpIHsKKyAgICAgIHJldHVybiBuZG46Om51bGxvcHQ7CisgICAgfQorICAgIHJldHVybiBpdC0+c2Vjb25kOworICB9CisKKyAgLyoqCisgICAqIEBicmllZiBBZGRzIGEgdXNlciBub2RlIGZvciBzeW5jaHJvbml6YXRpb24KKyAgICoKKyAgICogSW5pdGlhbGl6ZXMgbV9wcmVmaXhlc1twcmVmaXhdIHRvIHplcm8KKyAgICogRG9lcyBub3QgYWRkIHplcm8tdGggc2VxdWVuY2UgbnVtYmVyIHRvIElCRgorICAgKiBiZWNhdXNlIGlmIGEgbGFyZ2UgbnVtYmVyIG9mIHVzZXIgbm9kZXMgYXJlIGFkZGVkCisgICAqIHRoZW4gZGVjb2Rpbmcgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvd24gSUJGIGFuZAorICAgKiBvdGhlciBJQkYgd2lsbCBub3QgYmUgcG9zc2libGUKKyAgICoKKyAgICogQHBhcmFtIHByZWZpeCB0aGUgdXNlciBub2RlIHRvIGJlIGFkZGVkCisgICAqLworICBib29sCisgIGFkZFVzZXJOb2RlKGNvbnN0IG5kbjo6TmFtZSYgcHJlZml4KTsKKworICAvKioKKyAgICogQGJyaWVmIFJlbW92ZSB0aGUgdXNlciBub2RlIGZyb20gc3luY2hyb25pemF0aW9uCisgICAqCisgICAqIEVyYXNlcyBwcmVmaXggZnJvbSBJQkYgYW5kIG90aGVyIG1hcHMKKyAgICoKKyAgICogQHBhcmFtIHByZWZpeCB0aGUgdXNlciBub2RlIHRvIGJlIHJlbW92ZWQKKyAgICovCisgIHZvaWQKKyAgcmVtb3ZlVXNlck5vZGUoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgpOworCitQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BST1RFQ1RFRDoKKyAgLyoqCisgICAqIEBicmllZiBVcGRhdGUgbV9wcmVmaXhlcyBhbmQgSUJGIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgc2VxCisgICAqCisgICAqIFdob2V2ZXIgY2FsbHMgdGhpcyBuZWVkcyB0byBtYWtlIHN1cmUgdGhhdCBwcmVmaXggaXMgaW4gbV9wcmVmaXhlcworICAgKiBXZSByZW1vdmUgYWxyZWFkeSBleGlzdGluZyBwcmVmaXgvc2VxIGZyb20gSUJGCisgICAqICh1bmxlc3Mgc2VxIGlzIHplcm8gYmVjYXVzZSB3ZSBkb24ndCBpbnNlcnQgemVybyBzZXEgaW50byBJQkYpCisgICAqIFRoZW4gd2UgdXBkYXRlIG1fcHJlZml4LCBtX3ByZWZpeDJoYXNoLCBtX2hhc2gycHJlZml4LCBhbmQgSUJGCisgICAqCisgICAqIEBwYXJhbSBwcmVmaXggcHJlZml4IG9mIHRoZSB1cGRhdGUKKyAgICogQHBhcmFtIHNlcSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHVwZGF0ZQorICAgKi8KKyAgdm9pZAorICB1cGRhdGVTZXFObyhjb25zdCBuZG46Ok5hbWUmIHByZWZpeCwgdWludDY0X3Qgc2VxKTsKKworICBib29sCisgIGlzVXNlck5vZGUoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgpIHsKKyAgICBpZiAobV9wcmVmaXhlcy5maW5kKHByZWZpeCkgPT0gbV9wcmVmaXhlcy5lbmQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBAYnJpZWYgU2VuZHMgYSBkYXRhIHBhY2tldCB3aXRoIGNvbnRlbnQgdHlwZSBuYWNrCisgICAqCisgICAqIFByb2R1Y2VyIHNlbmRzIGEgbmFjayB0byBjb25zdW1lciBpZiBjb25zdW1lciBoYXMgdmVyeSBvbGQgSUJGCisgICAqIHdob3NlIGRpZmZlcmVuY2VzIHdpdGggbGF0ZXN0IElCRiBjYW4ndCBiZSBkZWNvZGVkIHN1Y2Nlc3NmdWxseQorICAgKgorICAgKiBAcGFyYW0gbmFtZSBzZW5kIGFwcGxpY2F0aW9uIG5hY2sgd2l0aCB0aGlzIG5hbWUKKyAgICovCisgIHZvaWQKKyAgc2VuZEFwcGxpY2F0aW9uTmFjayhjb25zdCBuZG46Ok5hbWUmIG5hbWUpOworCisgIC8qKgorICAgKiBAYnJpZWYgTG9ncyBhIG1lc3NhZ2UgaWYgc2V0dGluZyBhbiBpbnRlcmVzdCBmaWx0ZXIgZmFpbHMKKyAgICoKKyAgICogQHBhcmFtIHByZWZpeAorICAgKiBAcGFyYW0gbXNnCisgICAqLworICB2b2lkCisgIG9uUmVnaXN0ZXJGYWlsZWQoY29uc3QgbmRuOjpOYW1lJiBwcmVmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIGNvbnN0OworCitQVUJMSUNfV0lUSF9URVNUU19FTFNFX1BST1RFQ1RFRDoKKyAgSUJMVCBtX2libHQ7CisgIHVpbnQzMl90IG1fZXhwZWN0ZWROdW1FbnRyaWVzOworICAvLyBUaHJlc2hvbGQgaXMgdXNlZCBjaGVjayBpZiB0aGUgZGlmZmVyZW5jZXMgYXJlIGdyZWF0ZXIKKyAgLy8gdGhhbiBpdCBhbmQgd2hldGhlciB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgb3RoZXIgc2lkZS4KKyAgdWludDMyX3QgbV90aHJlc2hvbGQ7CisKKyAgLy8gcHJlZml4IGFuZCBzZXF1ZW5jZSBudW1iZXIKKyAgc3RkOjptYXAgPG5kbjo6TmFtZSwgdWludDY0X3Q+IG1fcHJlZml4ZXM7CisgIC8vIEp1c3QgZm9yIGxvb2tpbmcgdXAgaGFzaCBmYXN0ZXIgKGluc3RlYWQgb2YgY2FsY3VsYXRpbmcgaXQgYWdhaW4pCisgIC8vIE9ubHkgdXNlZCBpbiB1cGRhdGVTZXFObywgcHJlZml4L3NlcU5vIGlzIHRoZSBrZXkKKyAgc3RkOjptYXAgPG5kbjo6TmFtZSwgdWludDMyX3Q+IG1fcHJlZml4Mmhhc2g7CisgIC8vIFZhbHVlIGlzIHByZWZpeCAoYW5kIG5vdCBwcmVmaXgvc2VxTm8pCisgIHN0ZDo6bWFwIDx1aW50MzJfdCwgbmRuOjpOYW1lPiBtX2hhc2gycHJlZml4OworCisgIG5kbjo6RmFjZSYgbV9mYWNlOworICBuZG46OktleUNoYWluIG1fa2V5Q2hhaW47CisgIG5kbjo6U2NoZWR1bGVyIG1fc2NoZWR1bGVyOworCisgIG5kbjo6TmFtZSBtX3N5bmNQcmVmaXg7CisgIG5kbjo6TmFtZSBtX3VzZXJQcmVmaXg7CisKKyAgbmRuOjp0aW1lOjptaWxsaXNlY29uZHMgbV9zeW5jUmVwbHlGcmVzaG5lc3M7CisgIG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzIG1faGVsbG9SZXBseUZyZXNobmVzczsKKworICBzdGQ6Om10MTk5MzcgbV9ybmc7Cit9OworCit9IC8vIG5hbWVzcGFjZSBwc3luYworCisjZW5kaWYgLy8gUFNZTkNfUFJPRFVDRVJfQkFTRV9IUFAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Jvb3N0LW11bHRpLWxvZy1mb3JtYXR0ZXIuaHBwIGIvdGVzdHMvYm9vc3QtbXVsdGktbG9nLWZvcm1hdHRlci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5NDZmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Jvb3N0LW11bHRpLWxvZy1mb3JtYXR0ZXIuaHBwCkBAIC0wLDAgKzEsMjE0IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKgorICogQmFzZWQgb24gd29yayBieSBNYXJ0aW4gQmEgKGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI2NzE4MTg5KQorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgKiAoU2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAqLworCisjaWZuZGVmIE5ETl9URVNUU19CT09TVF9NVUxUSV9MT0dfRk9STUFUVEVSX0hQUAorI2RlZmluZSBORE5fVEVTVFNfQk9PU1RfTVVMVElfTE9HX0ZPUk1BVFRFUl9IUFAKKworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorCisjaWYgQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDAKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdF9wYXJhbWV0ZXJzLmhwcD4KKyNlbHNlCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC9kZXRhaWwvdW5pdF90ZXN0X3BhcmFtZXRlcnMuaHBwPgorI2VuZGlmIC8vIEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdF9sb2dfZm9ybWF0dGVyLmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L291dHB1dC9jb21waWxlcl9sb2dfZm9ybWF0dGVyLmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L291dHB1dC94bWxfbG9nX2Zvcm1hdHRlci5ocHA+CisKK25hbWVzcGFjZSBib29zdCB7CituYW1lc3BhY2UgdW5pdF90ZXN0IHsKK25hbWVzcGFjZSBvdXRwdXQgeworCisvKioKKyAqIEBicmllZiBMb2cgZm9ybWF0dGVyIGZvciBCb29zdC5UZXN0IHRoYXQgb3V0cHV0cyB0aGUgbG9nZ2luZyB0byBtdWx0aXBsZSBmb3JtYXR0ZXJzCisgKgorICogVGhlIGxvZyBmb3JtYXR0ZXIgaXMgZGVzaWduZWQgdG8gb3V0cHV0IHRvIG9uZSBvciBtdWx0aXBsZSBmb3JtYXR0ZXJzIGF0IHRoZSBzYW1lIHRpbWUuICBGb3IKKyAqIGV4YW1wbGUsIG9uZSBIUkYgZm9ybWF0dGVyIGNhbiBvdXRwdXQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCwgd2hpbGUgWE1MIGZvcm1hdHRlciBvdXRwdXQgdG8KKyAqIHRoZSBmaWxlLgorICoKKyAqIFVzYWdlOgorICoKKyAqICAgICAvLyBDYWxsIGluIGluaXRfdW5pdF90ZXN0X3N1aXRlOiAodGhpcyB3aWxsIG92ZXJyaWRlIHRoZSAtLWxvZ19mb3JtYXQgcGFyYW1ldGVyKQorICogICAgIGF1dG8gZm9ybWF0dGVyID0gbmV3IGJvb3N0Ojp1bml0X3Rlc3Q6Om91dHB1dDo6bXVsdGlfbG9nX2Zvcm1hdHRlcjsgLy8gc2FtZSBhcyBhbHJlYWR5IGNvbmZpZ3VyZWQgbG9nZ2VyCisgKgorICogICAgIC8vIFByZXBhcmUgYW5kIGFkZCBhZGRpdGlvbmFsIGxvZ2dlcihzKQorICogICAgIGZvcm1hdHRlci5hZGQoc3RkOjptYWtlX3NoYXJlZDxib29zdDo6dW5pdF90ZXN0OjpvdXRwdXQ6OnhtbF9sb2dfZm9ybWF0dGVyPigpLAorICogICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxzdGQ6Om9mc3RyZWFtPigib3V0LnhtbCIpKTsKKyAqCisgKiAgICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9sb2cuc2V0X2Zvcm1hdHRlcihmb3JtYXR0ZXIpOworICoKKyAqIEBub3RlIENhbGxpbmcgYGJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9sb2cuc2V0X3N0cmVhbSguLi4pYCB3aWxsIGNoYW5nZSB0aGUgc3RyZWFtIGZvcgorICogICAgICAgdGhlIG9yaWdpbmFsIGxvZ2dlci4KKyAqLworY2xhc3MgbXVsdGlfbG9nX2Zvcm1hdHRlciA6IHB1YmxpYyB1bml0X3Rlc3RfbG9nX2Zvcm1hdHRlcgoreworcHVibGljOgorICAvKioKKyAgICogQGJyaWVmIENyZWF0ZSBpbnN0YW5jZSBvZiB0aGUgbG9nZ2VyLCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBsb2dnZXIgaW5zdGFuY2UKKyAgICovCisgIG11bHRpX2xvZ19mb3JtYXR0ZXIoKQorICB7CisgICAgYXV0byBmb3JtYXQgPQorI2lmIEJPT1NUX1ZFUlNJT04gPiAxMDU5MDAKKyAgICAgIHJ1bnRpbWVfY29uZmlnOjpnZXQ8b3V0cHV0X2Zvcm1hdD4ocnVudGltZV9jb25maWc6OkxPR19GT1JNQVQpOworI2Vsc2UKKyAgICAgIHJ1bnRpbWVfY29uZmlnOjpsb2dfZm9ybWF0KCk7CisjZW5kaWYgLy8gQk9PU1RfVkVSU0lPTiA+IDEwNTkwMAorCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgIGRlZmF1bHQ6CisjaWYgQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDAKKyAgICAgIGNhc2UgT0ZfQ0xGOgorI2Vsc2UKKyAgICAgIGNhc2UgQ0xGOgorI2VuZGlmIC8vIEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwCisgICAgICAgIG1fbG9nZ2Vycy5wdXNoX2JhY2soe3N0ZDo6bWFrZV9zaGFyZWQ8Y29tcGlsZXJfbG9nX2Zvcm1hdHRlcj4oKSwgbnVsbHB0cn0pOworICAgICAgICBicmVhazsKKyNpZiBCT09TVF9WRVJTSU9OID49IDEwNTkwMAorICAgICAgY2FzZSBPRl9YTUw6CisjZWxzZQorICAgICAgY2FzZSBYTUw6CisjZW5kaWYgLy8gQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDAKKyAgICAgICAgbV9sb2dnZXJzLnB1c2hfYmFjayh7c3RkOjptYWtlX3NoYXJlZDx4bWxfbG9nX2Zvcm1hdHRlcj4oKSwgbnVsbHB0cn0pOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICB2b2lkCisgIGFkZChzdGQ6OnNoYXJlZF9wdHI8dW5pdF90ZXN0X2xvZ19mb3JtYXR0ZXI+IGZvcm1hdHRlciwgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6b3N0cmVhbT4gb3MpCisgIHsKKyAgICBtX2xvZ2dlcnMucHVzaF9iYWNrKHtmb3JtYXR0ZXIsIG9zfSk7CisgIH0KKworICAvLyBGb3JtYXR0ZXIgaW50ZXJmYWNlCisgIHZvaWQKKyAgbG9nX3N0YXJ0KHN0ZDo6b3N0cmVhbSYgb3MsIGNvdW50ZXJfdCB0ZXN0X2Nhc2VzX2Ftb3VudCkKKyAgeworICAgIGZvciAoYXV0byYgbCA6IG1fbG9nZ2VycykKKyAgICAgIGwubG9nZ2VyLT5sb2dfc3RhcnQobC5vcyA9PSBudWxscHRyID8gb3MgOiAqbC5vcywgdGVzdF9jYXNlc19hbW91bnQpOworICB9CisKKyAgdm9pZAorICBsb2dfZmluaXNoKHN0ZDo6b3N0cmVhbSYgb3MpCisgIHsKKyAgICBmb3IgKGF1dG8mIGwgOiBtX2xvZ2dlcnMpCisgICAgICBsLmxvZ2dlci0+bG9nX2ZpbmlzaChsLm9zID09IG51bGxwdHIgPyBvcyA6ICpsLm9zKTsKKyAgfQorCisgIHZvaWQKKyAgbG9nX2J1aWxkX2luZm8oc3RkOjpvc3RyZWFtJiBvcykKKyAgeworICAgIGZvciAoYXV0byYgbCA6IG1fbG9nZ2VycykKKyAgICAgIGwubG9nZ2VyLT5sb2dfYnVpbGRfaW5mbyhsLm9zID09IG51bGxwdHIgPyBvcyA6ICpsLm9zKTsKKyAgfQorCisgIHZvaWQKKyAgdGVzdF91bml0X3N0YXJ0KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IHRlc3RfdW5pdCYgdHUpCisgIHsKKyAgICBmb3IgKGF1dG8mIGwgOiBtX2xvZ2dlcnMpCisgICAgICBsLmxvZ2dlci0+dGVzdF91bml0X3N0YXJ0KGwub3MgPT0gbnVsbHB0ciA/IG9zIDogKmwub3MsIHR1KTsKKyAgfQorCisgIHZvaWQKKyAgdGVzdF91bml0X2ZpbmlzaChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCB0ZXN0X3VuaXQmIHR1LCB1bnNpZ25lZCBsb25nIGVsYXBzZWQpCisgIHsKKyAgICBmb3IgKGF1dG8mIGwgOiBtX2xvZ2dlcnMpCisgICAgICBsLmxvZ2dlci0+dGVzdF91bml0X2ZpbmlzaChsLm9zID09IG51bGxwdHIgPyBvcyA6ICpsLm9zLCB0dSwgZWxhcHNlZCk7CisgIH0KKworICB2b2lkCisgIHRlc3RfdW5pdF9za2lwcGVkKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IHRlc3RfdW5pdCYgdHUpCisgIHsKKyAgICBmb3IgKGF1dG8mIGwgOiBtX2xvZ2dlcnMpCisgICAgICBsLmxvZ2dlci0+dGVzdF91bml0X3NraXBwZWQobC5vcyA9PSBudWxscHRyID8gb3MgOiAqbC5vcywgdHUpOworICB9CisKKyNpZiBCT09TVF9WRVJTSU9OID49IDEwNTkwMAorICB2b2lkCisgIGxvZ19leGNlcHRpb25fc3RhcnQoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgbG9nX2NoZWNrcG9pbnRfZGF0YSYgbGNkLCBjb25zdCBleGVjdXRpb25fZXhjZXB0aW9uJiBleCkKKyAgeworICAgIGZvciAoYXV0byYgbCA6IG1fbG9nZ2VycykKKyAgICAgIGwubG9nZ2VyLT5sb2dfZXhjZXB0aW9uX3N0YXJ0KGwub3MgPT0gbnVsbHB0ciA/IG9zIDogKmwub3MsIGxjZCwgZXgpOworICB9CisKKyAgdm9pZAorICBsb2dfZXhjZXB0aW9uX2ZpbmlzaChzdGQ6Om9zdHJlYW0mIG9zKQorICB7CisgICAgZm9yIChhdXRvJiBsIDogbV9sb2dnZXJzKQorICAgICAgbC5sb2dnZXItPmxvZ19leGNlcHRpb25fZmluaXNoKGwub3MgPT0gbnVsbHB0ciA/IG9zIDogKmwub3MpOworICB9CisjZWxzZQorICB2b2lkCisgIGxvZ19leGNlcHRpb24oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgbG9nX2NoZWNrcG9pbnRfZGF0YSYgbGNkLCBjb25zdCBleGVjdXRpb25fZXhjZXB0aW9uJiBleCkKKyAgeworICAgIGZvciAoYXV0byYgbCA6IG1fbG9nZ2VycykKKyAgICAgIGwubG9nZ2VyLT5sb2dfZXhjZXB0aW9uKGwub3MgPT0gbnVsbHB0ciA/IG9zIDogKmwub3MsIGxjZCwgZXgpOworICB9CisjZW5kaWYgLy8gQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDAKKworICB2b2lkCisgIGxvZ19lbnRyeV9zdGFydChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBsb2dfZW50cnlfZGF0YSYgZW50cnlfZGF0YSwgbG9nX2VudHJ5X3R5cGVzIGxldCkKKyAgeworICAgIGZvciAoYXV0byYgbCA6IG1fbG9nZ2VycykKKyAgICAgIGwubG9nZ2VyLT5sb2dfZW50cnlfc3RhcnQobC5vcyA9PSBudWxscHRyID8gb3MgOiAqbC5vcywgZW50cnlfZGF0YSwgbGV0KTsKKyAgfQorCisgIHZvaWQKKyAgbG9nX2VudHJ5X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0X3N0cmluZyB2YWx1ZSkKKyAgeworICAgIGZvciAoYXV0byYgbCA6IG1fbG9nZ2VycykKKyAgICAgIGwubG9nZ2VyLT5sb2dfZW50cnlfdmFsdWUobC5vcyA9PSBudWxscHRyID8gb3MgOiAqbC5vcywgdmFsdWUpOworICB9CisKKyAgdm9pZAorICBsb2dfZW50cnlfZmluaXNoKHN0ZDo6b3N0cmVhbSYgb3MpCisgIHsKKyAgICBmb3IgKGF1dG8mIGwgOiBtX2xvZ2dlcnMpCisgICAgICBsLmxvZ2dlci0+bG9nX2VudHJ5X2ZpbmlzaChsLm9zID09IG51bGxwdHIgPyBvcyA6ICpsLm9zKTsKKyAgfQorCisjaWYgQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDAKKyAgdm9pZAorICBlbnRyeV9jb250ZXh0X3N0YXJ0KHN0ZDo6b3N0cmVhbSYgb3MsIGxvZ19sZXZlbCBsZXZlbCkKKyAgeworICAgIGZvciAoYXV0byYgbCA6IG1fbG9nZ2VycykKKyAgICAgIGwubG9nZ2VyLT5lbnRyeV9jb250ZXh0X3N0YXJ0KGwub3MgPT0gbnVsbHB0ciA/IG9zIDogKmwub3MsIGxldmVsKTsKKyAgfQorCisgIHZvaWQKKyAgbG9nX2VudHJ5X2NvbnRleHQoc3RkOjpvc3RyZWFtJiBvcywgY29uc3Rfc3RyaW5nIHZhbHVlKQorICB7CisgICAgZm9yIChhdXRvJiBsIDogbV9sb2dnZXJzKQorICAgICAgbC5sb2dnZXItPmxvZ19lbnRyeV9jb250ZXh0KGwub3MgPT0gbnVsbHB0ciA/IG9zIDogKmwub3MsIHZhbHVlKTsKKyAgfQorCisgIHZvaWQKKyAgZW50cnlfY29udGV4dF9maW5pc2goc3RkOjpvc3RyZWFtJiBvcykKKyAgeworICAgIGZvciAoYXV0byYgbCA6IG1fbG9nZ2VycykKKyAgICAgIGwubG9nZ2VyLT5lbnRyeV9jb250ZXh0X2ZpbmlzaChsLm9zID09IG51bGxwdHIgPyBvcyA6ICpsLm9zKTsKKyAgfQorI2VuZGlmIC8vIEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwCisKK3ByaXZhdGU6CisgIHN0cnVjdCBMb2dnZXJJbmZvCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8dW5pdF90ZXN0X2xvZ19mb3JtYXR0ZXI+IGxvZ2dlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpvc3RyZWFtPiBvczsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8TG9nZ2VySW5mbz4gbV9sb2dnZXJzOworfTsKKworfSAvLyBuYW1lc3BhY2Ugb3V0cHV0Cit9IC8vIG5hbWVzcGFjZSB1bml0X3Rlc3QKK30gLy8gbmFtZXNwYWNlIGJvb3N0CisKKyNlbmRpZiAvLyBORE5fVEVTVFNfQk9PU1RfTVVMVElfTE9HX0ZPUk1BVFRFUl9IUFAKZGlmZiAtLWdpdCBhL3Rlc3RzL2Jvb3N0LXRlc3QuaHBwIGIvdGVzdHMvYm9vc3QtdGVzdC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxZjQwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2Jvb3N0LXRlc3QuaHBwCkBAIC0wLDAgKzEsMzUgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgUFN5bmMuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBQU3luYyBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogUFN5bmMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogUFN5bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogUFN5bmMsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBcYXV0aG9yIFlpbmdkaSBZdSA8eWluZ2RpQGNzLnVjbGEuZWR1PgorICoKKyAqKi8KKworI2lmbmRlZiBQU1lOQ19URVNUU19CT09TVF9URVNUX0hQUAorI2RlZmluZSBQU1lOQ19URVNUU19CT09TVF9URVNUX0hQUAorCisvLyBzdXBwcmVzcyB3YXJuaW5ncyBmcm9tIEJvb3N0LlRlc3QKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNwcmFnbWEgY2xhbmcgc3lzdGVtX2hlYWRlcgorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2NvbmNlcHRfY2hlY2suaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3Qvb3V0cHV0X3Rlc3Rfc3RyZWFtLmhwcD4KKworI2VuZGlmIC8vIFBTWU5DX1RFU1RTX0JPT1NUX1RFU1RfSFBQCmRpZmYgLS1naXQgYS90ZXN0cy9tYWluLmNwcCBiL3Rlc3RzL21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDVlNGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tYWluLmNwcApAQCAtMCwwICsxLDExNSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsICBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyaXpvbmEgQm9hcmQgb2YgUmVnZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JhZG8gU3RhdGUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0eSBQaWVycmUgJiBNYXJpZSBDdXJpZSwgU29yYm9ubmUgVW5pdmVyc2l0eSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FzaGluZ3RvbiBVbml2ZXJzaXR5IGluIFN0LiBMb3VpcywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVpamluZyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBQU3luYy4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIFBTeW5jIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBQU3luYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBQU3luYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBQU3luYywgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9EWU5fTElOSworI2RlZmluZSBCT09TVF9URVNUX0FMVEVSTkFUSVZFX0lOSVRfQVBJCisKKyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KKworI2lmIEJPT1NUX1ZFUlNJT04gPj0gMTA2MjAwCisvLyBCb29zdC5UZXN0IHYzLjMgKEJvb3N0IDEuNjIpIG5hdGl2ZWx5IHN1cHBvcnRzIG11bHRpLWxvZ2dlciBvdXRwdXQKKyNpbmNsdWRlICJib29zdC10ZXN0LmhwcCIKKyNlbHNlCisjZGVmaW5lIEJPT1NUX1RFU1RfTk9fTUFJTgorI2luY2x1ZGUgImJvb3N0LXRlc3QuaHBwIgorCisjaW5jbHVkZSAiYm9vc3QtbXVsdGktbG9nLWZvcm1hdHRlci5ocHAiCisKKyNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMvb3B0aW9uc19kZXNjcmlwdGlvbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJvZ3JhbV9vcHRpb25zL3ZhcmlhYmxlc19tYXAuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy9wYXJzZXJzLmhwcD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3N0YXRpYyBib29sCitpbml0X3Rlc3RzKCkKK3sKKyAgaW5pdF91bml0X3Rlc3QoKTsKKworICBuYW1lc3BhY2UgcG8gPSBib29zdDo6cHJvZ3JhbV9vcHRpb25zOworICBuYW1lc3BhY2UgdXQgPSBib29zdDo6dW5pdF90ZXN0OworCisgIHBvOjpvcHRpb25zX2Rlc2NyaXB0aW9uIGV4dHJhT3B0aW9uczsKKyAgc3RkOjpzdHJpbmcgbG9nZ2VyOworICBzdGQ6OnN0cmluZyBvdXRwdXRGaWxlID0gIi0iOworICBleHRyYU9wdGlvbnMuYWRkX29wdGlvbnMoKQorICAgICgibG9nX2Zvcm1hdDIiLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZsb2dnZXIpLCAiVHlwZSBvZiBzZWNvbmQgbG9nIGZvcm1hdHRlcjogSFJGIG9yIFhNTCIpCisgICAgKCJsb2dfc2luazIiLCBwbzo6dmFsdWU8c3RkOjpzdHJpbmc+KCZvdXRwdXRGaWxlKS0+ZGVmYXVsdF92YWx1ZShvdXRwdXRGaWxlKSwgIlNlY29uZCBsb2cgc2luaywgLSBmb3Igc3Rkb3V0IikKKyAgICA7CisgIHBvOjp2YXJpYWJsZXNfbWFwIHZtOworICB0cnkgeworICAgIHBvOjpzdG9yZShwbzo6Y29tbWFuZF9saW5lX3BhcnNlcih1dDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndikKKyAgICAgICAgICAgICAgICAub3B0aW9ucyhleHRyYU9wdGlvbnMpCisgICAgICAgICAgICAgICAgLnJ1bigpLAorICAgICAgICAgICAgICB2bSk7CisgICAgcG86Om5vdGlmeSh2bSk7CisgIH0KKyAgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgc3RkOjpjZXJyIDw8ICJFUlJPUjogIiA8PCBlLndoYXQoKSA8PCAiXG4iCisgICAgICAgICAgICAgIDw8IGV4dHJhT3B0aW9ucyA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHZtLmNvdW50KCJsb2dfZm9ybWF0MiIpID09IDApIHsKKyAgICAvLyBzZWNvbmQgbG9nZ2VyIGlzIG5vdCBjb25maWd1cmVkCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8dXQ6OnVuaXRfdGVzdF9sb2dfZm9ybWF0dGVyPiBmb3JtYXR0ZXI7CisgIGlmIChsb2dnZXIgPT0gIlhNTCIpIHsKKyAgICBmb3JtYXR0ZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPHV0OjpvdXRwdXQ6OnhtbF9sb2dfZm9ybWF0dGVyPigpOworICB9CisgIGVsc2UgaWYgKGxvZ2dlciA9PSAiSFJGIikgeworICAgIGZvcm1hdHRlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8dXQ6Om91dHB1dDo6Y29tcGlsZXJfbG9nX2Zvcm1hdHRlcj4oKTsKKyAgfQorICBlbHNlIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkVSUk9SOiBvbmx5IEhSRiBvciBYTUwgbG9nIGZvcm1hdHRlciBjYW4gYmUgc3BlY2lmaWVkIiA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6b3N0cmVhbT4gb3V0cHV0OworICBpZiAob3V0cHV0RmlsZSA9PSAiLSIpIHsKKyAgICBvdXRwdXQgPSBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpvc3RyZWFtPigmc3RkOjpjb3V0LCBzdGQ6OmJpbmQoW117fSkpOworICB9CisgIGVsc2UgeworICAgIG91dHB1dCA9IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjpvZnN0cmVhbT4ob3V0cHV0RmlsZS5jX3N0cigpKTsKKyAgfQorCisgIGF1dG8gbXVsdGlGb3JtYXR0ZXIgPSBuZXcgdXQ6Om91dHB1dDo6bXVsdGlfbG9nX2Zvcm1hdHRlcjsKKyAgbXVsdGlGb3JtYXR0ZXItPmFkZChmb3JtYXR0ZXIsIG91dHB1dCk7CisgIHV0Ojp1bml0X3Rlc3RfbG9nLnNldF9mb3JtYXR0ZXIobXVsdGlGb3JtYXR0ZXIpOworCisgIHJldHVybiB0cnVlOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdGVzdHMsIGFyZ2MsIGFyZ3YpOworfQorCisjZW5kaWYgLy8gQk9PU1RfVkVSU0lPTiA+PSAxMDYyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3QtYmxvb20tZmlsdGVyLmNwcCBiL3Rlc3RzL3Rlc3QtYmxvb20tZmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWI3MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdC1ibG9vbS1maWx0ZXIuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgUFN5bmMuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBQU3luYyBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogUFN5bmMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogUFN5bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogUFN5bmMsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgImRldGFpbC9ibG9vbS1maWx0ZXIuaHBwIgorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbmFtZS5ocHA+CisKK25hbWVzcGFjZSBwc3luYyB7CisKK3VzaW5nIG5hbWVzcGFjZSBuZG47CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUZXN0Qmxvb21GaWx0ZXIpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEJhc2ljKQoreworICBCbG9vbUZpbHRlciBiZigxMDAsIDAuMDAxKTsKKworICBzdGQ6OnN0cmluZyBpbnNlcnROYW1lKCIvbWVtcGhpcyIpOworICBiZi5pbnNlcnQoaW5zZXJ0TmFtZSk7CisgIEJPT1NUX0NIRUNLKGJmLmNvbnRhaW5zKGluc2VydE5hbWUpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTmFtZUFwcGVuZEFuZEV4dHJhY3QpCit7CisgIE5hbWUgYmZOYW1lKCIvdGVzdCIpOworICBCbG9vbUZpbHRlciBiZigxMDAsIDAuMDAxKTsKKyAgYmYuaW5zZXJ0KCIvbWVtcGhpcyIpOworCisgIGJmLmFwcGVuZFRvTmFtZShiZk5hbWUpOworCisgIEJsb29tRmlsdGVyIGJmRnJvbU5hbWUoMTAwLCAwLjAwMSwgYmZOYW1lLmdldCgtMSkpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGJmTmFtZS5nZXQoMSkudG9OdW1iZXIoKSwgMTAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYmZOYW1lLmdldCgyKS50b051bWJlcigpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYmYsIGJmRnJvbU5hbWUpOworCisgIEJPT1NUX0NIRUNLX1RIUk9XKEJsb29tRmlsdGVyIGluQ29tcGF0aWJsZUJmKDIwMCwgMC4wMDEsIGJmTmFtZS5nZXQoLTEpKSwgc3RkOjpydW50aW1lX2Vycm9yKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHBzeW5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdC1jb25zdW1lci5jcHAgYi90ZXN0cy90ZXN0LWNvbnN1bWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjdhZmFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdC1jb25zdW1lci5jcHAKQEAgLTAsMCArMSw2MyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBQU3luYy4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIFBTeW5jIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBQU3luYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBQU3luYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBQU3luYywgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaW5jbHVkZSAiY29uc3VtZXIuaHBwIgorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbmFtZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2R1bW15LWNsaWVudC1mYWNlLmhwcD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgcHN5bmMgeworCit1c2luZyBuYW1lc3BhY2UgbmRuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRlc3RDb25zdW1lcikKKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ29uc3RydWN0b3IpCit7CisgIHV0aWw6OkR1bW15Q2xpZW50RmFjZSBmYWNlKHt0cnVlLCB0cnVlfSk7CisgIEJPT1NUX1JFUVVJUkVfTk9fVEhST1coQ29uc3VtZXIoTmFtZSgiL3BzeW5jIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAoY29uc3QgdmVjdG9yPE5hbWU+JiBhdmFpbGFibGVTdWJzKSB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSAoY29uc3QgdmVjdG9yPE1pc3NpbmdEYXRhSW5mbz4pIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEFkZFN1YnNjcmlwdGlvbikKK3sKKyAgdXRpbDo6RHVtbXlDbGllbnRGYWNlIGZhY2Uoe3RydWUsIHRydWV9KTsKKyAgQ29uc3VtZXIgY29uc3VtZXIoTmFtZSgiL3BzeW5jIiksIGZhY2UsCisgICAgICAgICAgICAgICAgICAgIFtdIChjb25zdCB2ZWN0b3I8TmFtZT4mIGF2YWlsYWJsZVN1YnMpIHt9LAorICAgICAgICAgICAgICAgICAgICBbXSAoY29uc3QgdmVjdG9yPE1pc3NpbmdEYXRhSW5mbz4pIHt9LAorICAgICAgICAgICAgICAgICAgICA0MCwgMC4wMDEpOworCisgIE5hbWUgc3Vic2NyaXB0aW9uKCJ0ZXN0Iik7CisKKyAgQk9PU1RfQ0hFQ0soIWNvbnN1bWVyLmlzU3Vic2NyaWJlZChzdWJzY3JpcHRpb24pKTsKKyAgQk9PU1RfQ0hFQ0soY29uc3VtZXIuYWRkU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikpOworICBCT09TVF9DSEVDSyghY29uc3VtZXIuYWRkU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgcHN5bmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0LWZ1bGwtcHJvZHVjZXIuY3BwIGIvdGVzdHMvdGVzdC1mdWxsLXByb2R1Y2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QyYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdC1mdWxsLXByb2R1Y2VyLmNwcApAQCAtMCwwICsxLDU3IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFBTeW5jLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgUFN5bmMgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIFBTeW5jIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFBTeW5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIFBTeW5jLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJmdWxsLXByb2R1Y2VyLmhwcCIKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L25hbWUuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9kdW1teS1jbGllbnQtZmFjZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tZ210L25mZC9jb250cm9sLXBhcmFtZXRlcnMuaHBwPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBwc3luYyB7CisKK3VzaW5nIG5hbWVzcGFjZSBuZG47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVGVzdEZ1bGxQcm9kdWNlcikKKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ29uc3RydWN0b3IpCit7CisgIHV0aWw6OkR1bW15Q2xpZW50RmFjZSBmYWNlKHt0cnVlLCB0cnVlfSk7CisgIEJPT1NUX1JFUVVJUkVfTk9fVEhST1coRnVsbFByb2R1Y2VyKDQwLCBmYWNlLCBOYW1lKCIvcHN5bmMiKSwgTmFtZSgiL3Rlc3RVc2VyIiksIG51bGxwdHIpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoT25JbnRlcmVzdCkKK3sKKyAgTmFtZSBzeW5jUHJlZml4KCIvcHN5bmMiKSwgdXNlck5vZGUoIi90ZXN0VXNlciIpOworICB1dGlsOjpEdW1teUNsaWVudEZhY2UgZmFjZSh7dHJ1ZSwgdHJ1ZX0pOworCisgIEZ1bGxQcm9kdWNlciBub2RlKDQwLCBmYWNlLCBzeW5jUHJlZml4LCB1c2VyTm9kZSwgbnVsbHB0cik7CisKKyAgTmFtZSBzeW5jSW50ZXJlc3ROYW1lKHN5bmNQcmVmaXgpOworICBzeW5jSW50ZXJlc3ROYW1lLmFwcGVuZCgibWFsaWNpb3VzLUlCRiIpOworCisgIEJPT1NUX1JFUVVJUkVfTk9fVEhST1cobm9kZS5vbkludGVyZXN0KHN5bmNQcmVmaXgsIEludGVyZXN0KHN5bmNJbnRlcmVzdE5hbWUpKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSBwc3luYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3QtZnVsbC1zeW5jLmNwcCBiL3Rlc3RzL3Rlc3QtZnVsbC1zeW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTUzYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdC1mdWxsLXN5bmMuY3BwCkBAIC0wLDAgKzEsNDMwIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFBTeW5jLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgUFN5bmMgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIFBTeW5jIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFBTeW5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIFBTeW5jLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJmdWxsLXByb2R1Y2VyLmhwcCIKKyNpbmNsdWRlICJjb25zdW1lci5ocHAiCisjaW5jbHVkZSAidW5pdC10ZXN0LXRpbWUtZml4dHVyZS5ocHAiCisjaW5jbHVkZSAiZGV0YWlsL3N0YXRlLmhwcCIKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L25hbWUuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9kdW1teS1jbGllbnQtZmFjZS5ocHA+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIHBzeW5jIHsKKwordXNpbmcgbmFtZXNwYWNlIG5kbjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIEZ1bGxTeW5jRml4dHVyZSA6IHB1YmxpYyB0ZXN0czo6VW5pdFRlc3RUaW1lRml4dHVyZQoreworcHVibGljOgorICBGdWxsU3luY0ZpeHR1cmUoKQorICAgOiBzeW5jUHJlZml4KCJwc3luYyIpCisgIHsKKyAgfQorCisgIHZvaWQKKyAgYWRkTm9kZShpbnQgaWQpCisgIHsKKyAgICBmYWNlc1tpZF0gPSBzdGQ6Om1ha2Vfc2hhcmVkPHV0aWw6OkR1bW15Q2xpZW50RmFjZT4oaW8sIHV0aWw6OkR1bW15Q2xpZW50RmFjZTo6T3B0aW9uc3t0cnVlLCB0cnVlfSk7CisgICAgdXNlclByZWZpeGVzW2lkXSA9IE5hbWUoInVzZXJQcmVmaXgiICsgdG9fc3RyaW5nKGlkKSk7CisgICAgbm9kZXNbaWRdID0gbWFrZV9zaGFyZWQ8RnVsbFByb2R1Y2VyPig0MCwgKmZhY2VzW2lkXSwgc3luY1ByZWZpeCwgdXNlclByZWZpeGVzW2lkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdIChjb25zdCBzdGQ6OnZlY3RvcjxNaXNzaW5nRGF0YUluZm8+JiB1cGRhdGVzKSB7fSk7CisgIH0KKworICBOYW1lIHN5bmNQcmVmaXg7CisgIHNoYXJlZF9wdHI8dXRpbDo6RHVtbXlDbGllbnRGYWNlPiBmYWNlc1s0XTsKKyAgTmFtZSB1c2VyUHJlZml4ZXNbNF07CisgIHNoYXJlZF9wdHI8RnVsbFByb2R1Y2VyPiBub2Rlc1s0XTsKK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShGdWxsU3luYywgRnVsbFN5bmNGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUd29Ob2Rlc1NpbXBsZSkKK3sKKyAgYWRkTm9kZSgwKTsKKyAgYWRkTm9kZSgxKTsKKworICBmYWNlc1swXS0+bGlua1RvKCpmYWNlc1sxXSk7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApKTsKKworICBub2Rlc1swXS0+cHVibGlzaE5hbWUodXNlclByZWZpeGVzWzBdKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCksIDEwMCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobm9kZXNbMF0tPmdldFNlcU5vKHVzZXJQcmVmaXhlc1swXSkudmFsdWVfb3IoLTEpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobm9kZXNbMV0tPmdldFNlcU5vKHVzZXJQcmVmaXhlc1swXSkudmFsdWVfb3IoLTEpLCAxKTsKKworICBub2Rlc1sxXS0+cHVibGlzaE5hbWUodXNlclByZWZpeGVzWzFdKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCksIDEwMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzBdLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbMV0pLnZhbHVlX29yKC0xKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzFdLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbMV0pLnZhbHVlX29yKC0xKSwgMSk7CisKKyAgbm9kZXNbMV0tPnB1Ymxpc2hOYW1lKHVzZXJQcmVmaXhlc1sxXSk7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1swXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzFdKS52YWx1ZV9vcigtMSksIDIpOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1sxXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzFdKS52YWx1ZV9vcigtMSksIDIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShUd29Ob2Rlc0ZvcmNlU2VxTm8pCit7CisgIGFkZE5vZGUoMCk7CisgIGFkZE5vZGUoMSk7CisKKyAgZmFjZXNbMF0tPmxpbmtUbygqZmFjZXNbMV0pOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisKKyAgbm9kZXNbMF0tPnB1Ymxpc2hOYW1lKHVzZXJQcmVmaXhlc1swXSwgMyk7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzBdLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbMF0pLnZhbHVlX29yKC0xKSwgMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzFdLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbMF0pLnZhbHVlX29yKC0xKSwgMyk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFR3b05vZGVzV2l0aE11bHRpcGxlVXNlck5vZGVzKQoreworICBhZGROb2RlKDApOworICBhZGROb2RlKDEpOworCisgIGZhY2VzWzBdLT5saW5rVG8oKmZhY2VzWzFdKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworCisgIE5hbWUgbm9kZVplcm9FeHRyYVVzZXIoInVzZXJQcmVmaXgwLTEiKTsKKyAgTmFtZSBub2RlT25lRXh0cmFVc2VyKCJ1c2VyUHJlZml4MS0xIik7CisKKyAgbm9kZXNbMF0tPmFkZFVzZXJOb2RlKG5vZGVaZXJvRXh0cmFVc2VyKTsKKyAgbm9kZXNbMV0tPmFkZFVzZXJOb2RlKG5vZGVPbmVFeHRyYVVzZXIpOworCisgIG5vZGVzWzBdLT5wdWJsaXNoTmFtZSh1c2VyUHJlZml4ZXNbMF0pOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSwgMTAwKTsKKworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1swXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzBdKS52YWx1ZV9vcigtMSksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1sxXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzBdKS52YWx1ZV9vcigtMSksIDEpOworCisgIG5vZGVzWzBdLT5wdWJsaXNoTmFtZShub2RlWmVyb0V4dHJhVXNlcik7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzBdLT5nZXRTZXFObyhub2RlWmVyb0V4dHJhVXNlcikudmFsdWVfb3IoLTEpLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobm9kZXNbMV0tPmdldFNlcU5vKG5vZGVaZXJvRXh0cmFVc2VyKS52YWx1ZV9vcigtMSksIDEpOworCisgIG5vZGVzWzFdLT5wdWJsaXNoTmFtZShub2RlT25lRXh0cmFVc2VyKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCksIDEwMCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobm9kZXNbMF0tPmdldFNlcU5vKG5vZGVPbmVFeHRyYVVzZXIpLnZhbHVlX29yKC0xKSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzFdLT5nZXRTZXFObyhub2RlT25lRXh0cmFVc2VyKS52YWx1ZV9vcigtMSksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNdWx0aXBsZU5vZGVzKQoreworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGFkZE5vZGUoaSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGZhY2VzW2ldLT5saW5rVG8oKmZhY2VzW2kgKyAxXSk7CisgIH0KKworICBub2Rlc1swXS0+cHVibGlzaE5hbWUodXNlclByZWZpeGVzWzBdKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCksIDEwMCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobm9kZXNbaV0tPmdldFNlcU5vKHVzZXJQcmVmaXhlc1swXSkudmFsdWVfb3IoLTEpLCAxKTsKKyAgfQorCisgIG5vZGVzWzFdLT5wdWJsaXNoTmFtZSh1c2VyUHJlZml4ZXNbMV0pOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSwgMTAwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1tpXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzFdKS52YWx1ZV9vcigtMSksIDEpOworICB9CisKKyAgbm9kZXNbMV0tPnB1Ymxpc2hOYW1lKHVzZXJQcmVmaXhlc1sxXSk7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzW2ldLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbMV0pLnZhbHVlX29yKC0xKSwgMik7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTXVsdGlwbGVOb2Rlc1NpbXVsYXRhbmVvdXNQdWJsaXNoKQoreworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGFkZE5vZGUoaSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGZhY2VzW2ldLT5saW5rVG8oKmZhY2VzW2kgKyAxXSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIG5vZGVzW2ldLT5wdWJsaXNoTmFtZSh1c2VyUHJlZml4ZXNbaV0pOworICB9CisKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCksIDEwMCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzW2ldLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbal0pLnZhbHVlX29yKC0xKSwgMSk7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBub2Rlc1tpXS0+cHVibGlzaE5hbWUodXNlclByZWZpeGVzW2ldLCA0KTsKKyAgfQorCisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1tpXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzW2pdKS52YWx1ZV9vcigtMSksIDQpOworICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShOZXR3b3JrUGFydGl0aW9uKQoreworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGFkZE5vZGUoaSk7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGZhY2VzW2ldLT5saW5rVG8oKmZhY2VzW2kgKyAxXSk7CisgIH0KKworICBub2Rlc1swXS0+cHVibGlzaE5hbWUodXNlclByZWZpeGVzWzBdKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCksIDEwMCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobm9kZXNbaV0tPmdldFNlcU5vKHVzZXJQcmVmaXhlc1swXSkudmFsdWVfb3IoLTEpLCAxKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgZmFjZXNbaV0tPnVubGluaygpOworICB9CisKKyAgZmFjZXNbMF0tPmxpbmtUbygqZmFjZXNbMV0pOworICBmYWNlc1syXS0+bGlua1RvKCpmYWNlc1szXSk7CisKKyAgbm9kZXNbMF0tPnB1Ymxpc2hOYW1lKHVzZXJQcmVmaXhlc1swXSk7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1sxXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzBdKS52YWx1ZV9vcigtMSksIDIpOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1syXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzBdKS52YWx1ZV9vcigtMSksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1szXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzBdKS52YWx1ZV9vcigtMSksIDEpOworCisgIG5vZGVzWzFdLT5wdWJsaXNoTmFtZSh1c2VyUHJlZml4ZXNbMV0sIDIpOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSwgMTAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobm9kZXNbMF0tPmdldFNlcU5vKHVzZXJQcmVmaXhlc1sxXSkudmFsdWVfb3IoLTEpLCAyKTsKKworICBub2Rlc1syXS0+cHVibGlzaE5hbWUodXNlclByZWZpeGVzWzJdLCAyKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCksIDEwMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzNdLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbMl0pLnZhbHVlX29yKC0xKSwgMik7CisKKyAgbm9kZXNbM10tPnB1Ymxpc2hOYW1lKHVzZXJQcmVmaXhlc1szXSwgMik7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1syXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzNdKS52YWx1ZV9vcigtMSksIDIpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzBdLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbM10pLnZhbHVlX29yKC0xKSwgLTEpOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1sxXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzNdKS52YWx1ZV9vcigtMSksIC0xKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGZhY2VzW2ldLT51bmxpbmsoKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgZmFjZXNbaV0tPmxpbmtUbygqZmFjZXNbaSArIDFdKTsKKyAgfQorCisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1tpXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzW2pdKS52YWx1ZV9vcigtMSksIDIpOworICAgIH0KKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShJQkZPdmVyZmxvdykKK3sKKyAgYWRkTm9kZSgwKTsKKyAgYWRkTm9kZSgxKTsKKworICBmYWNlc1swXS0+bGlua1RvKCpmYWNlc1sxXSk7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApKTsKKworICAvLyA1MCA+IDQwIChleHBlY3RlZCBudW1iZXIgb2YgZW50cmllcyBpbiBJQkYpCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7IGkrKykgeworICAgIG5vZGVzWzBdLT5hZGRVc2VyTm9kZShOYW1lKCJ1c2VyTm9kZTAtIiArIHRvX3N0cmluZyhpKSkpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgLy8gU3VwcG9zZSBhbGwgc3luYyBkYXRhIHdlcmUgbG9zdCBmb3IgdGhlc2U6CisgICAgbm9kZXNbMF0tPnVwZGF0ZVNlcU5vKE5hbWUoInVzZXJOb2RlMC0iICsgdG9fc3RyaW5nKGkpKSwgMSk7CisgIH0KKyAgbm9kZXNbMF0tPnB1Ymxpc2hOYW1lKE5hbWUoInVzZXJOb2RlMC0iICsgdG9fc3RyaW5nKDIwKSkpOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSwgMTAwKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8PSAyMDsgaSsrKSB7CisgICAgTmFtZSB1c2VyUHJlZml4KCJ1c2VyTm9kZTAtIiArIHRvX3N0cmluZyhpKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobm9kZXNbMV0tPmdldFNlcU5vKHVzZXJQcmVmaXgpLnZhbHVlX29yKC0xKSwgMSk7CisgIH0KKworICBmb3IgKGludCBpID0gMjE7IGkgPCA0OTsgaSsrKSB7CisgICAgbm9kZXNbMF0tPnVwZGF0ZVNlcU5vKE5hbWUoInVzZXJOb2RlMC0iICsgdG9fc3RyaW5nKGkpKSwgMSk7CisgIH0KKyAgbm9kZXNbMF0tPnB1Ymxpc2hOYW1lKE5hbWUoInVzZXJOb2RlMC00OSIpKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCksIDEwMCk7CisKKyAgZm9yIChpbnQgaSA9IDIxOyBpIDwgNDk7IGkrKykgeworICAgIE5hbWUgdXNlclByZWZpeCgidXNlck5vZGUwLSIgKyB0b19zdHJpbmcoaSkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzFdLT5nZXRTZXFObyh1c2VyUHJlZml4KS52YWx1ZV9vcigtMSksIDEpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKERpZmZJQkZEZWNvZGVGYWlsdXJlU2ltcGxlKQoreworICBhZGROb2RlKDApOworICBhZGROb2RlKDEpOworCisgIGZhY2VzWzBdLT5saW5rVG8oKmZhY2VzWzFdKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworCisgIC8vIExvd2VzdCBudW1iZXIgdGhhdCB0cmlnZ2VycyBhIGRlY29kZSBmYWlsdXJlIGZvciBJQkYgc2l6ZSBvZiA0MAorICBpbnQgdG90YWxVcGRhdGVzID0gNDc7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gdG90YWxVcGRhdGVzOyBpKyspIHsKKyAgICBub2Rlc1swXS0+YWRkVXNlck5vZGUoTmFtZSgidXNlck5vZGUwLSIgKyB0b19zdHJpbmcoaSkpKTsKKyAgICBpZiAoaSAhPSB0b3RhbFVwZGF0ZXMpIHsKKyAgICAgIG5vZGVzWzBdLT51cGRhdGVTZXFObyhOYW1lKCJ1c2VyTm9kZTAtIiArIHRvX3N0cmluZyhpKSksIDEpOworICAgIH0KKyAgfQorICBub2Rlc1swXS0+cHVibGlzaE5hbWUoTmFtZSgidXNlck5vZGUwLSIgKyB0b19zdHJpbmcodG90YWxVcGRhdGVzKSkpOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSwgMTAwKTsKKworICAvLyBObyBtZWNoYW5pc20gdG8gcmVjb3ZlciB5ZXQKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gdG90YWxVcGRhdGVzOyBpKyspIHsKKyAgICBOYW1lIHVzZXJQcmVmaXgoInVzZXJOb2RlMC0iICsgdG9fc3RyaW5nKGkpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1sxXS0+Z2V0U2VxTm8odXNlclByZWZpeCkudmFsdWVfb3IoLTEpLCAxKTsKKyAgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzBdLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbMV0pLnZhbHVlX29yKC0xKSwgLTEpOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1sxXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzBdKS52YWx1ZV9vcigtMSksIC0xKTsKKworICBub2Rlc1sxXS0+cHVibGlzaE5hbWUodXNlclByZWZpeGVzWzFdKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCksIDEwMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzBdLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbMV0pLnZhbHVlX29yKC0xKSwgMSk7CisKKyAgbm9kZXNbMF0tPnB1Ymxpc2hOYW1lKHVzZXJQcmVmaXhlc1swXSk7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1sxXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzBdKS52YWx1ZV9vcigtMSksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShEaWZmSUJGRGVjb2RlRmFpbHVyZVNpbXBsZVNlZ21lbnRlZFJlY292ZXJ5KQoreworICBhZGROb2RlKDApOworICBhZGROb2RlKDEpOworCisgIC8vIFNpbXBsZSBjb250ZW50IHN0b3JlCisgIGZhY2VzWzBdLT5vblNlbmRJbnRlcmVzdC5jb25uZWN0KFt0aGlzXSAoY29uc3QgSW50ZXJlc3QmIGludGVyZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRhdGEgOiBmYWNlc1sxXS0+c2VudERhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZ2V0TmFtZSgpID09IGludGVyZXN0LmdldE5hbWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzWzBdLT5yZWNlaXZlKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNbMV0tPnJlY2VpdmUoaW50ZXJlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgIGZhY2VzWzBdLT5vblNlbmREYXRhLmNvbm5lY3QoW3RoaXNdIChjb25zdCBEYXRhJiBkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzWzFdLT5yZWNlaXZlKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgZmFjZXNbMV0tPm9uU2VuZEludGVyZXN0LmNvbm5lY3QoW3RoaXNdIChjb25zdCBJbnRlcmVzdCYgaW50ZXJlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGF0YSA6IGZhY2VzWzBdLT5zZW50RGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5nZXROYW1lKCkgPT0gaW50ZXJlc3QuZ2V0TmFtZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNbMV0tPnJlY2VpdmUoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlc1swXS0+cmVjZWl2ZShpbnRlcmVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgZmFjZXNbMV0tPm9uU2VuZERhdGEuY29ubmVjdChbdGhpc10gKGNvbnN0IERhdGEmIGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNbMF0tPnJlY2VpdmUoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisKKyAgLy8gTG93ZXN0IG51bWJlciB0aGF0IHRyaWdnZXJzIGEgZGVjb2RlIGZhaWx1cmUgZm9yIElCRiBzaXplIG9mIDQwCisgIGludCB0b3RhbFVwZGF0ZXMgPSAyNzA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gdG90YWxVcGRhdGVzOyBpKyspIHsKKyAgICBub2Rlc1swXS0+YWRkVXNlck5vZGUoTmFtZSgidXNlck5vZGUwLSIgKyB0b19zdHJpbmcoaSkpKTsKKyAgICBpZiAoaSAhPSB0b3RhbFVwZGF0ZXMpIHsKKyAgICAgIG5vZGVzWzBdLT51cGRhdGVTZXFObyhOYW1lKCJ1c2VyTm9kZTAtIiArIHRvX3N0cmluZyhpKSksIDEpOworICAgIH0KKyAgfQorICBub2Rlc1swXS0+cHVibGlzaE5hbWUoTmFtZSgidXNlck5vZGUwLSIgKyB0b19zdHJpbmcodG90YWxVcGRhdGVzKSkpOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSwgMTAwKTsKKworICAvLyBObyBtZWNoYW5pc20gdG8gcmVjb3ZlciB5ZXQKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gdG90YWxVcGRhdGVzOyBpKyspIHsKKyAgICBOYW1lIHVzZXJQcmVmaXgoInVzZXJOb2RlMC0iICsgdG9fc3RyaW5nKGkpKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1sxXS0+Z2V0U2VxTm8odXNlclByZWZpeCkudmFsdWVfb3IoLTEpLCAxKTsKKyAgfQorCisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzBdLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbMV0pLnZhbHVlX29yKC0xKSwgLTEpOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1sxXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzBdKS52YWx1ZV9vcigtMSksIC0xKTsKKworICBub2Rlc1sxXS0+cHVibGlzaE5hbWUodXNlclByZWZpeGVzWzFdKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCksIDEwMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5vZGVzWzBdLT5nZXRTZXFObyh1c2VyUHJlZml4ZXNbMV0pLnZhbHVlX29yKC0xKSwgMSk7CisKKyAgbm9kZXNbMF0tPnB1Ymxpc2hOYW1lKHVzZXJQcmVmaXhlc1swXSk7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworICBCT09TVF9DSEVDS19FUVVBTChub2Rlc1sxXS0+Z2V0U2VxTm8odXNlclByZWZpeGVzWzBdKS52YWx1ZV9vcigtMSksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShEaWZmSUJGRGVjb2RlRmFpbHVyZU11bHRpcGxlTm9kZXMpCit7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgYWRkTm9kZShpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgZmFjZXNbaV0tPmxpbmtUbygqZmFjZXNbaSArIDFdKTsKKyAgfQorCisgIC8vIExvd2VzdCBudW1iZXIgdGhhdCB0cmlnZ2VycyBhIGRlY29kZSBmYWlsdXJlIGZvciBJQkYgc2l6ZSBvZiA0MAorICBpbnQgdG90YWxVcGRhdGVzID0gNDc7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gdG90YWxVcGRhdGVzOyBpKyspIHsKKyAgICBub2Rlc1swXS0+YWRkVXNlck5vZGUoTmFtZSgidXNlck5vZGUwLSIgKyB0b19zdHJpbmcoaSkpKTsKKyAgICBpZiAoaSAhPSB0b3RhbFVwZGF0ZXMpIHsKKyAgICAgIG5vZGVzWzBdLT51cGRhdGVTZXFObyhOYW1lKCJ1c2VyTm9kZTAtIiArIHRvX3N0cmluZyhpKSksIDEpOworICAgIH0KKyAgfQorICBub2Rlc1swXS0+cHVibGlzaE5hbWUoTmFtZSgidXNlck5vZGUwLSIgKyB0b19zdHJpbmcodG90YWxVcGRhdGVzKSkpOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSwgMTAwKTsKKworICAvLyBObyBtZWNoYW5pc20gdG8gcmVjb3ZlciB5ZXQKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gdG90YWxVcGRhdGVzOyBpKyspIHsKKyAgICBOYW1lIHVzZXJQcmVmaXgoInVzZXJOb2RlMC0iICsgdG9fc3RyaW5nKGkpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobm9kZXNbal0tPmdldFNlcU5vKHVzZXJQcmVmaXgpLnZhbHVlX29yKC0xKSwgMSk7CisgICAgfQorICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSBwc3luYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3QtaWJsdC5jcHAgYi90ZXN0cy90ZXN0LWlibHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzQ5MzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0LWlibHQuY3BwCkBAIC0wLDAgKzEsMjAxIEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFBTeW5jLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgUFN5bmMgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIFBTeW5jIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFBTeW5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIFBTeW5jLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJkZXRhaWwvaWJsdC5ocHAiCisjaW5jbHVkZSAiZGV0YWlsL3V0aWwuaHBwIgorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbmFtZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9pbnRlcmVzdC5ocHA+CisKK25hbWVzcGFjZSBwc3luYyB7CisKK3VzaW5nIG5hbWVzcGFjZSBuZG47CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUZXN0SUJMVCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoRXF1YWwpCit7CisgIGludCBzaXplID0gMTA7CisKKyAgSUJMVCBpYmx0MShzaXplKTsKKyAgSUJMVCBpYmx0MihzaXplKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaWJsdDEsIGlibHQyKTsKKworICBzdGQ6OnN0cmluZyBwcmVmaXggPSBOYW1lKCIvdGVzdC9tZW1waGlzIikuYXBwZW5kTnVtYmVyKDEpLnRvVXJpKCk7CisgIHVpbnQzMl90IG5ld0hhc2ggPSBtdXJtdXJIYXNoMygxMSwgcHJlZml4KTsKKyAgaWJsdDEuaW5zZXJ0KG5ld0hhc2gpOworICBpYmx0Mi5pbnNlcnQobmV3SGFzaCk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoaWJsdDEsIGlibHQyKTsKKworICBOYW1lIGliZk5hbWUxKCJzeW5jIiksIGliZk5hbWUyKCJzeW5jIik7CisgIGlibHQxLmFwcGVuZFRvTmFtZShpYmZOYW1lMSk7CisgIGlibHQyLmFwcGVuZFRvTmFtZShpYmZOYW1lMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGliZk5hbWUxLCBpYmZOYW1lMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE5hbWVBcHBlbmRBbmRFeHRyYWN0KQoreworICBpbnQgc2l6ZSA9IDEwOworCisgIElCTFQgaWJsdChzaXplKTsKKyAgc3RkOjpzdHJpbmcgcHJlZml4ID0gTmFtZSgiL3Rlc3QvbWVtcGhpcyIpLmFwcGVuZE51bWJlcigxKS50b1VyaSgpOworICB1aW50MzJfdCBuZXdIYXNoID0gbXVybXVySGFzaDMoMTEsIHByZWZpeCk7CisgIGlibHQuaW5zZXJ0KG5ld0hhc2gpOworCisgIE5hbWUgaWJsdE5hbWUoInN5bmMiKTsKKyAgaWJsdC5hcHBlbmRUb05hbWUoaWJsdE5hbWUpOworCisgIElCTFQgcmN2ZChzaXplKTsKKyAgcmN2ZC5pbml0aWFsaXplKGlibHROYW1lLmdldCgtMSkpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGlibHQsIHJjdmQpOworCisgIElCTFQgcmN2ZERpZmZTaXplKDIwKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cocmN2ZERpZmZTaXplLmluaXRpYWxpemUoaWJsdE5hbWUuZ2V0KC0xKSksIHN0ZDo6cnVudGltZV9lcnJvcik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKENvcHlJbnNlcnRFcmFzZSkKK3sKKyAgaW50IHNpemUgPSAxMDsKKworICBJQkxUIGlibHQxKHNpemUpOworCisgIHN0ZDo6c3RyaW5nIHByZWZpeCA9IE5hbWUoIi90ZXN0L21lbXBoaXMiKS5hcHBlbmROdW1iZXIoMSkudG9VcmkoKTsKKyAgdWludDMyX3QgaGFzaDEgPSBtdXJtdXJIYXNoMygxMSwgcHJlZml4KTsKKyAgaWJsdDEuaW5zZXJ0KGhhc2gxKTsKKworICBJQkxUIGlibHQyKGlibHQxKTsKKyAgaWJsdDIuZXJhc2UoaGFzaDEpOworICBwcmVmaXggPSBOYW1lKCIvdGVzdC9tZW1waGlzIikuYXBwZW5kTnVtYmVyKDIpLnRvVXJpKCk7CisgIHVpbnQzMl90IGhhc2gzID0gbXVybXVySGFzaDMoMTEsIHByZWZpeCk7CisgIGlibHQyLmluc2VydChoYXNoMyk7CisKKyAgaWJsdDEuZXJhc2UoaGFzaDEpOworICBwcmVmaXggPSBOYW1lKCIvdGVzdC9tZW1waGlzIikuYXBwZW5kTnVtYmVyKDUpLnRvVXJpKCk7CisgIHVpbnQzMl90IGhhc2g1ID0gbXVybXVySGFzaDMoMTEsIHByZWZpeCk7CisgIGlibHQxLmluc2VydChoYXNoNSk7CisKKyAgaWJsdDIuZXJhc2UoaGFzaDMpOworICBpYmx0Mi5pbnNlcnQoaGFzaDUpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKGlibHQxLCBpYmx0Mik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEhpZ2hlclNlcVRlc3QpCit7CisgIC8vIFRoZSBjYXNlIHdoZXJlIHdlIGNhbid0IHJlY29nbml6ZSBpZiB0aGUgcmN2ZCBJQkYgaGFzIGhpZ2hlciBzZXF1ZW5jZSBudW1iZXIKKyAgLy8gUmVsZXZhbnQgdG8gZnVsbCBzeW5jIGNhc2UKKyAgaW50IHNpemUgPSAxMDsKKworICBJQkxUIG93bklCRihzaXplKTsKKyAgSUJMVCByY3ZkSUJGKHNpemUpOworCisgIHN0ZDo6c3RyaW5nIHByZWZpeCA9IE5hbWUoIi90ZXN0L21lbXBoaXMiKS5hcHBlbmROdW1iZXIoMykudG9VcmkoKTsKKyAgdWludDMyX3QgaGFzaDEgPSBtdXJtdXJIYXNoMygxMSwgcHJlZml4KTsKKyAgb3duSUJGLmluc2VydChoYXNoMSk7CisKKyAgc3RkOjpzdHJpbmcgcHJlZml4MiA9IE5hbWUoIi90ZXN0L21lbXBoaXMiKS5hcHBlbmROdW1iZXIoNCkudG9VcmkoKTsKKyAgdWludDMyX3QgaGFzaDIgPSBtdXJtdXJIYXNoMygxMSwgcHJlZml4Mik7CisgIHJjdmRJQkYuaW5zZXJ0KGhhc2gyKTsKKworICBJQkxUIGRpZmYgPSBvd25JQkYgLSByY3ZkSUJGOworICBzdGQ6OnNldDx1aW50MzJfdD4gcG9zaXRpdmU7CisgIHN0ZDo6c2V0PHVpbnQzMl90PiBuZWdhdGl2ZTsKKworICBCT09TVF9DSEVDSyhkaWZmLmxpc3RFbnRyaWVzKHBvc2l0aXZlLCBuZWdhdGl2ZSkpOworICBCT09TVF9DSEVDSygqcG9zaXRpdmUuYmVnaW4oKSA9PSBoYXNoMSk7CisgIEJPT1NUX0NIRUNLKCpuZWdhdGl2ZS5iZWdpbigpID09IGhhc2gyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoRGlmZmVyZW5jZSkKK3sKKyAgaW50IHNpemUgPSAxMDsKKworICBJQkxUIG93bklCRihzaXplKTsKKworICBJQkxUIHJjdmRJQkYgPSBvd25JQkY7CisKKyAgSUJMVCBkaWZmID0gb3duSUJGIC0gcmN2ZElCRjsKKworICBzdGQ6OnNldDx1aW50MzJfdD4gcG9zaXRpdmU7IC8vIG5vbi1lbXB0eSBQb3NpdGl2ZSBtZWFucyB3ZSBoYXZlIHNvbWUgZWxlbWVudHMgdGhhdCB0aGUgb3RoZXJzIGRvbid0CisgIHN0ZDo6c2V0PHVpbnQzMl90PiBuZWdhdGl2ZTsKKworICBCT09TVF9DSEVDSyhkaWZmLmxpc3RFbnRyaWVzKHBvc2l0aXZlLCBuZWdhdGl2ZSkpOworICBCT09TVF9DSEVDS19FUVVBTChwb3NpdGl2ZS5zaXplKCksIDApOworICBCT09TVF9DSEVDS19FUVVBTChuZWdhdGl2ZS5zaXplKCksIDApOworCisgIHN0ZDo6c3RyaW5nIHByZWZpeCA9IE5hbWUoIi90ZXN0L21lbXBoaXMiKS5hcHBlbmROdW1iZXIoMSkudG9VcmkoKTsKKyAgdWludDMyX3QgbmV3SGFzaCA9IG11cm11ckhhc2gzKDExLCBwcmVmaXgpOworICBvd25JQkYuaW5zZXJ0KG5ld0hhc2gpOworCisgIGRpZmYgPSBvd25JQkYgLSByY3ZkSUJGOworICBCT09TVF9DSEVDSyhkaWZmLmxpc3RFbnRyaWVzKHBvc2l0aXZlLCBuZWdhdGl2ZSkpOworICBCT09TVF9DSEVDS19FUVVBTChwb3NpdGl2ZS5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChuZWdhdGl2ZS5zaXplKCksIDApOworCisgIHByZWZpeCA9IE5hbWUoIi90ZXN0L2NzdSIpLmFwcGVuZE51bWJlcigxKS50b1VyaSgpOworICBuZXdIYXNoID0gbXVybXVySGFzaDMoMTEsIHByZWZpeCk7CisgIHJjdmRJQkYuaW5zZXJ0KG5ld0hhc2gpOworCisgIGRpZmYgPSBvd25JQkYgLSByY3ZkSUJGOworICBCT09TVF9DSEVDSyhkaWZmLmxpc3RFbnRyaWVzKHBvc2l0aXZlLCBuZWdhdGl2ZSkpOworICBCT09TVF9DSEVDS19FUVVBTChwb3NpdGl2ZS5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTChuZWdhdGl2ZS5zaXplKCksIDEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShEaWZmZXJlbmNlQndPdmVyc2l6ZWRJQkZzKQoreworICAvLyBJbnNlcnQgNTAgZWxlbWVudHMgaW50byBJQkYgb2Ygc2l6ZSAxMAorICAvLyBDaGVjayB0aGF0IHdlIGNhbiBzdGlsbCBsaXN0IHRoZSBkaWZmZXJlbmNlCisgIC8vIGV2ZW4gdGhvdWdoIHdlIGNhbid0IGxpc3QgdGhlIElCRnMgaXRzZWxmCisKKyAgaW50IHNpemUgPSAxMDsKKworICBJQkxUIG93bklCRihzaXplKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpKyspIHsKKyAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSBOYW1lKCIvdGVzdC9tZW1waGlzIiArIHN0ZDo6dG9fc3RyaW5nKGkpKS5hcHBlbmROdW1iZXIoMSkudG9VcmkoKTsKKyAgICB1aW50MzJfdCBuZXdIYXNoID0gbXVybXVySGFzaDMoMTEsIHByZWZpeCk7CisgICAgb3duSUJGLmluc2VydChuZXdIYXNoKTsKKyAgfQorCisgIElCTFQgcmN2ZElCRiA9IG93bklCRjsKKworICBzdGQ6OnN0cmluZyBwcmVmaXggPSBOYW1lKCIvdGVzdC91Y2xhIikuYXBwZW5kTnVtYmVyKDEpLnRvVXJpKCk7CisgIHVpbnQzMl90IG5ld0hhc2ggPSBtdXJtdXJIYXNoMygxMSwgcHJlZml4KTsKKyAgb3duSUJGLmluc2VydChuZXdIYXNoKTsKKworICBJQkxUIGRpZmYgPSBvd25JQkYgLSByY3ZkSUJGOworCisgIHN0ZDo6c2V0PHVpbnQzMl90PiBwb3NpdGl2ZTsKKyAgc3RkOjpzZXQ8dWludDMyX3Q+IG5lZ2F0aXZlOworICBCT09TVF9DSEVDSyhkaWZmLmxpc3RFbnRyaWVzKHBvc2l0aXZlLCBuZWdhdGl2ZSkpOworICBCT09TVF9DSEVDS19FUVVBTChwb3NpdGl2ZS5zaXplKCksIDEpOworICBCT09TVF9DSEVDS19FUVVBTCgqcG9zaXRpdmUuYmVnaW4oKSwgbmV3SGFzaCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG5lZ2F0aXZlLnNpemUoKSwgMCk7CisKKyAgQk9PU1RfQ0hFQ0soIW93bklCRi5saXN0RW50cmllcyhwb3NpdGl2ZSwgbmVnYXRpdmUpKTsKKyAgQk9PU1RfQ0hFQ0soIXJjdmRJQkYubGlzdEVudHJpZXMocG9zaXRpdmUsIG5lZ2F0aXZlKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSBwc3luYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3QtcGFydGlhbC1wcm9kdWNlci5jcHAgYi90ZXN0cy90ZXN0LXBhcnRpYWwtcHJvZHVjZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZWQxYWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0LXBhcnRpYWwtcHJvZHVjZXIuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvKiAtKi0gTW9kZTpDKys7IGMtZmlsZS1zdHlsZToiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWw7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE4LCAgVGhlIFVuaXZlcnNpdHkgb2YgTWVtcGhpcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIFBTeW5jLgorICogU2VlIEFVVEhPUlMubWQgZm9yIGNvbXBsZXRlIGxpc3Qgb2YgUFN5bmMgYXV0aG9ycyBhbmQgY29udHJpYnV0b3JzLgorICoKKyAqIFBTeW5jIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFBTeW5jIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsKKyAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIFBTeW5jLCBlLmcuLCBpbiBDT1BZSU5HLm1kIGZpbGUuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiovCisKKyNpbmNsdWRlICJwYXJ0aWFsLXByb2R1Y2VyLmhwcCIKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L25hbWUuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvdXRpbC9kdW1teS1jbGllbnQtZmFjZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9tZ210L25mZC9jb250cm9sLXBhcmFtZXRlcnMuaHBwPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK25hbWVzcGFjZSBwc3luYyB7CisKK3VzaW5nIG5hbWVzcGFjZSBuZG47Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVGVzdFBhcnRpYWxQcm9kdWNlcikKKworQk9PU1RfQVVUT19URVNUX0NBU0UoQ29uc3RydWN0b3IpCit7CisgIHV0aWw6OkR1bW15Q2xpZW50RmFjZSBmYWNlKHt0cnVlLCB0cnVlfSk7CisgIEJPT1NUX1JFUVVJUkVfTk9fVEhST1coUGFydGlhbFByb2R1Y2VyKDQwLCBmYWNlLCBOYW1lKCIvcHN5bmMiKSwgTmFtZSgiL3Rlc3RVc2VyIikpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUmVnaXN0ZXJQcmVmaXgpCit7CisgIE5hbWUgc3luY1ByZWZpeCgiL3BzeW5jIiksIHVzZXJOb2RlKCIvdGVzdFVzZXIiKTsKKyAgdXRpbDo6RHVtbXlDbGllbnRGYWNlIGZhY2Uoe3RydWUsIHRydWV9KTsKKyAgUGFydGlhbFByb2R1Y2VyIHByb2R1Y2VyKDQwLCBmYWNlLCBzeW5jUHJlZml4LCB1c2VyTm9kZSk7CisKKyAgZmFjZS5wcm9jZXNzRXZlbnRzKHRpbWU6Om1pbGxpc2Vjb25kcygtMSkpOworCisgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZmFjZS5zZW50SW50ZXJlc3RzLnNpemUoKSwgMSk7CisKKyAgZmFjZS5zZW50SW50ZXJlc3RzLmJhY2soKTsKKyAgSW50ZXJlc3QgaW50ZXJlc3QgPSAqZmFjZS5zZW50SW50ZXJlc3RzLmJlZ2luKCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGludGVyZXN0LmdldE5hbWUoKS5nZXQoMyksIG5hbWU6OkNvbXBvbmVudCgicmVnaXN0ZXIiKSk7CisgIG5hbWU6OkNvbXBvbmVudCB0ZXN0ID0gaW50ZXJlc3QuZ2V0TmFtZSgpLmdldCg0KTsKKyAgbmZkOjpDb250cm9sUGFyYW1ldGVycyBwYXJhbXModGVzdC5ibG9ja0Zyb21WYWx1ZSgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocGFyYW1zLmdldE5hbWUoKSwgc3luY1ByZWZpeCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKFB1Ymxpc2hOYW1lKQoreworICBOYW1lIHN5bmNQcmVmaXgoIi9wc3luYyIpLCB1c2VyTm9kZSgiL3Rlc3RVc2VyIiksIG5vblVzZXIoIi90ZXN0VXNlcjIiKTsKKyAgdXRpbDo6RHVtbXlDbGllbnRGYWNlIGZhY2Uoe3RydWUsIHRydWV9KTsKKyAgUGFydGlhbFByb2R1Y2VyIHByb2R1Y2VyKDQwLCBmYWNlLCBzeW5jUHJlZml4LCB1c2VyTm9kZSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocHJvZHVjZXIuZ2V0U2VxTm8odXNlck5vZGUpLnZhbHVlX29yKC0xKSwgMCk7CisgIHByb2R1Y2VyLnB1Ymxpc2hOYW1lKHVzZXJOb2RlKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocHJvZHVjZXIuZ2V0U2VxTm8odXNlck5vZGUpLnZhbHVlX29yKC0xKSwgMSk7CisKKyAgcHJvZHVjZXIucHVibGlzaE5hbWUodXNlck5vZGUpOworICBCT09TVF9DSEVDS19FUVVBTChwcm9kdWNlci5nZXRTZXFObyh1c2VyTm9kZSkudmFsdWVfb3IoLTEpLCAyKTsKKworICBwcm9kdWNlci5wdWJsaXNoTmFtZSh1c2VyTm9kZSwgMTApOworICBCT09TVF9DSEVDS19FUVVBTChwcm9kdWNlci5nZXRTZXFObyh1c2VyTm9kZSkudmFsdWVfb3IoLTEpLCAxMCk7CisKKyAgcHJvZHVjZXIucHVibGlzaE5hbWUobm9uVXNlcik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHByb2R1Y2VyLmdldFNlcU5vKG5vblVzZXIpLnZhbHVlX29yKC0xKSwgLTEpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShTYW1lU3luY0ludGVyZXN0KQoreworICBOYW1lIHN5bmNQcmVmaXgoIi9wc3luYyIpLCB1c2VyTm9kZSgiL3Rlc3RVc2VyIik7CisgIHV0aWw6OkR1bW15Q2xpZW50RmFjZSBmYWNlKHt0cnVlLCB0cnVlfSk7CisgIFBhcnRpYWxQcm9kdWNlciBwcm9kdWNlcig0MCwgZmFjZSwgc3luY1ByZWZpeCwgdXNlck5vZGUpOworCisgIE5hbWUgc3luY0ludGVyZXN0TmFtZShzeW5jUHJlZml4KTsKKyAgc3luY0ludGVyZXN0TmFtZS5hcHBlbmQoInN5bmMiKTsKKworICBCbG9vbUZpbHRlciBiZigyMCwgMC4wMDEpOworICBiZi5hcHBlbmRUb05hbWUoc3luY0ludGVyZXN0TmFtZSk7CisKKyAgcHJvZHVjZXIubV9pYmx0LmFwcGVuZFRvTmFtZShzeW5jSW50ZXJlc3ROYW1lKTsKKworICBJbnRlcmVzdCBzeW5jSW50ZXJlc3Qoc3luY0ludGVyZXN0TmFtZSk7CisgIHN5bmNJbnRlcmVzdC5zZXRJbnRlcmVzdExpZmV0aW1lKHRpbWU6Om1pbGxpc2Vjb25kcygxMDAwKSk7CisgIHN5bmNJbnRlcmVzdC5zZXROb25jZSgxKTsKKyAgQk9PU1RfUkVRVUlSRV9OT19USFJPVyhwcm9kdWNlci5vblN5bmNJbnRlcmVzdChzeW5jSW50ZXJlc3ROYW1lLCBzeW5jSW50ZXJlc3QpKTsKKyAgZmFjZS5wcm9jZXNzRXZlbnRzKHRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworICBCT09TVF9DSEVDS19FUVVBTChwcm9kdWNlci5tX3BlbmRpbmdFbnRyaWVzLnNpemUoKSwgMSk7CisKKyAgZmFjZS5wcm9jZXNzRXZlbnRzKHRpbWU6Om1pbGxpc2Vjb25kcyg1MDApKTsKKworICAvLyBTYW1lIGludGVyZXN0IGFnYWluIC0gc2l6ZSBvZiBwZW5kaW5nIGludGVyZXN0IHNob3VsZCByZW1haW4gc2FtZSwgYnV0IGV4cGlyYXRpb25FdmVudCBzaG91bGQgY2hhbmdlCisgIHN5bmNJbnRlcmVzdC5zZXROb25jZSgyKTsKKyAgQk9PU1RfUkVRVUlSRV9OT19USFJPVyhwcm9kdWNlci5vblN5bmNJbnRlcmVzdChzeW5jSW50ZXJlc3ROYW1lLCBzeW5jSW50ZXJlc3QpKTsKKyAgZmFjZS5wcm9jZXNzRXZlbnRzKHRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworICBCT09TVF9DSEVDS19FUVVBTChwcm9kdWNlci5tX3BlbmRpbmdFbnRyaWVzLnNpemUoKSwgMSk7CisKKyAgZmFjZS5wcm9jZXNzRXZlbnRzKHRpbWU6Om1pbGxpc2Vjb25kcyg1MDApKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocHJvZHVjZXIubV9wZW5kaW5nRW50cmllcy5zaXplKCksIDEpOworCisgIGZhY2UucHJvY2Vzc0V2ZW50cyh0aW1lOjptaWxsaXNlY29uZHMoNTAwKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHByb2R1Y2VyLm1fcGVuZGluZ0VudHJpZXMuc2l6ZSgpLCAwKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoT25TeW5jSW50ZXJlc3QpCit7CisgIE5hbWUgc3luY1ByZWZpeCgiL3BzeW5jIiksIHVzZXJOb2RlKCIvdGVzdFVzZXIiKTsKKyAgdXRpbDo6RHVtbXlDbGllbnRGYWNlIGZhY2Uoe3RydWUsIHRydWV9KTsKKyAgUGFydGlhbFByb2R1Y2VyIHByb2R1Y2VyKDQwLCBmYWNlLCBzeW5jUHJlZml4LCB1c2VyTm9kZSk7CisKKyAgLy8gU3luYyBpbnRlcmVzdCB3aXRoIG5vIGJsb29tIGZpbHRlciBhdHRhY2hlZAorICBOYW1lIHN5bmNJbnRlcmVzdE5hbWUoc3luY1ByZWZpeCk7CisgIHN5bmNJbnRlcmVzdE5hbWUuYXBwZW5kKCJzeW5jIik7CisgIHByb2R1Y2VyLm1faWJsdC5hcHBlbmRUb05hbWUoc3luY0ludGVyZXN0TmFtZSk7CisgIEJPT1NUX1JFUVVJUkVfTk9fVEhST1cocHJvZHVjZXIub25TeW5jSW50ZXJlc3Qoc3luY0ludGVyZXN0TmFtZSwgSW50ZXJlc3Qoc3luY0ludGVyZXN0TmFtZSkpKTsKKworICAvLyBTeW5jIGludGVyZXN0IHdpdGggbWFsaWNpb3VzIGJsb29tIGZpbHRlcgorICBzeW5jSW50ZXJlc3ROYW1lID0gc3luY1ByZWZpeDsKKyAgc3luY0ludGVyZXN0TmFtZS5hcHBlbmQoInN5bmMiKTsKKyAgc3luY0ludGVyZXN0TmFtZS5hcHBlbmROdW1iZXIoMjApOyAvLyBjb3VudCBvZiBibG9vbSBmaWx0ZXIKKyAgc3luY0ludGVyZXN0TmFtZS5hcHBlbmROdW1iZXIoMSk7ICAvLyBmYWxzZSBwb3NpdGl2ZSBwcm9iYWJpbGl0eSAqIDEwMDAgb2YgYmxvb20gZmlsdGVyCisgIHN5bmNJbnRlcmVzdE5hbWUuYXBwZW5kKCJmYWtlLW5hbWUiKTsKKyAgcHJvZHVjZXIubV9pYmx0LmFwcGVuZFRvTmFtZShzeW5jSW50ZXJlc3ROYW1lKTsKKyAgQk9PU1RfUkVRVUlSRV9OT19USFJPVyhwcm9kdWNlci5vblN5bmNJbnRlcmVzdChzeW5jSW50ZXJlc3ROYW1lLCBJbnRlcmVzdChzeW5jSW50ZXJlc3ROYW1lKSkpOworCisgIC8vIFN5bmMgaW50ZXJlc3Qgd2l0aCBtYWxpY2lvdXMgSUJGCisgIHN5bmNJbnRlcmVzdE5hbWUgPSBzeW5jUHJlZml4OworICBzeW5jSW50ZXJlc3ROYW1lLmFwcGVuZCgic3luYyIpOworICBCbG9vbUZpbHRlciBiZigyMCwgMC4wMDEpOworICBiZi5hcHBlbmRUb05hbWUoc3luY0ludGVyZXN0TmFtZSk7CisgIHN5bmNJbnRlcmVzdE5hbWUuYXBwZW5kKCJmYWtlLW5hbWUiKTsKKyAgQk9PU1RfUkVRVUlSRV9OT19USFJPVyhwcm9kdWNlci5vblN5bmNJbnRlcmVzdChzeW5jSW50ZXJlc3ROYW1lLCBJbnRlcmVzdChzeW5jSW50ZXJlc3ROYW1lKSkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworfSAvLyBuYW1lc3BhY2UgcHN5bmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy90ZXN0LXBhcnRpYWwtc3luYy5jcHAgYi90ZXN0cy90ZXN0LXBhcnRpYWwtc3luYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyODAwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3Rlc3QtcGFydGlhbC1zeW5jLmNwcApAQCAtMCwwICsxLDM0OSBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBQU3luYy4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIFBTeW5jIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBQU3luYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBQU3luYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBQU3luYywgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaW5jbHVkZSAicGFydGlhbC1wcm9kdWNlci5ocHAiCisjaW5jbHVkZSAiY29uc3VtZXIuaHBwIgorI2luY2x1ZGUgInVuaXQtdGVzdC10aW1lLWZpeHR1cmUuaHBwIgorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvbmFtZS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2R1bW15LWNsaWVudC1mYWNlLmhwcD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgcHN5bmMgeworCit1c2luZyBuYW1lc3BhY2UgbmRuOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgUGFydGlhbFN5bmNGaXh0dXJlIDogcHVibGljIHRlc3RzOjpVbml0VGVzdFRpbWVGaXh0dXJlCit7CitwdWJsaWM6CisgIFBhcnRpYWxTeW5jRml4dHVyZSgpCisgICA6IGZhY2UoaW8sIHt0cnVlLCB0cnVlfSkKKyAgICwgc3luY1ByZWZpeCgicHN5bmMiKQorICAgLCB1c2VyUHJlZml4KCJ0ZXN0VXNlci0wIikKKyAgICwgbnVtSGVsbG9EYXRhUmN2ZCgwKQorICAgLCBudW1TeW5jRGF0YVJjdmQoMCkKKyAgeworICAgIHByb2R1Y2VyID0gbWFrZV9zaGFyZWQ8UGFydGlhbFByb2R1Y2VyPig0MCwgZmFjZSwgc3luY1ByZWZpeCwgdXNlclByZWZpeCk7CisgICAgYWRkVXNlck5vZGVzKCJ0ZXN0VXNlciIsIDEwKTsKKyAgfQorCisgIHZvaWQKKyAgYWRkQ29uc3VtZXIoaW50IGlkLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgc3Vic2NyaWJlVG8pCisgIHsKKyAgICBjb25zdW1lckZhY2VzW2lkXSA9IG1ha2Vfc2hhcmVkPHV0aWw6OkR1bW15Q2xpZW50RmFjZT4oaW8sIHV0aWw6OkR1bW15Q2xpZW50RmFjZTo6T3B0aW9uc3t0cnVlLCB0cnVlfSk7CisKKyAgICBmYWNlLmxpbmtUbygqY29uc3VtZXJGYWNlc1tpZF0pOworCisgICAgY29uc3VtZXJzW2lkXSA9IG1ha2Vfc2hhcmVkPENvbnN1bWVyPihzeW5jUHJlZml4LCAqY29uc3VtZXJGYWNlc1tpZF0sCisgICAgICAgICAgICAgICAgICAgICAgWyYsIGlkXSAoY29uc3QgdmVjdG9yPE5hbWU+JiBhdmFpbGFibGVTdWJzKQorICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUhlbGxvRGF0YVJjdmQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3ViTGlzdChhdmFpbGFibGVTdWJzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tJQkZVcGRhdGVkKGlkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWIgOiBzdWJzY3JpYmVUbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcnNbaWRdLT5hZGRTdWJzY3JpcHRpb24oc3ViKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyc1tpZF0tPnNlbmRTeW5jSW50ZXJlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgIFsmLCBpZF0gKGNvbnN0IHN0ZDo6dmVjdG9yPE1pc3NpbmdEYXRhSW5mbz4mIHVwZGF0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bVN5bmNEYXRhUmN2ZCsrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0lCRlVwZGF0ZWQoaWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHVwZGF0ZSA6IHVwZGF0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0soY29uc3VtZXJzW2lkXS0+aXNTdWJzY3JpYmVkKHVwZGF0ZS5wcmVmaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwob2xkU2VxTWFwLmF0KHVwZGF0ZS5wcmVmaXgpICsgMSwgdXBkYXRlLmxvd1NlcSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKHByb2R1Y2VyLT5tX3ByZWZpeGVzLmF0KHVwZGF0ZS5wcmVmaXgpLCB1cGRhdGUuaGlnaFNlcSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKGNvbnN1bWVyc1tpZF0tPmdldFNlcU5vKHVwZGF0ZS5wcmVmaXgpLnZhbHVlKCksIHVwZGF0ZS5oaWdoU2VxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9LCA0MCwgMC4wMDEpOworCisgICAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworICB9CisKKyAgdm9pZAorICBjaGVja0lCRlVwZGF0ZWQoaW50IGlkKQorICB7CisgICAgTmFtZSBlbXB0eU5hbWU7CisgICAgcHJvZHVjZXItPm1faWJsdC5hcHBlbmRUb05hbWUoZW1wdHlOYW1lKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTChjb25zdW1lcnNbaWRdLT5tX2libHQsIGVtcHR5TmFtZSk7CisgIH0KKworICBib29sCisgIGNoZWNrU3ViTGlzdChjb25zdCB2ZWN0b3I8TmFtZT4mIGF2YWlsYWJsZVN1YnMpCisgIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHByZWZpeCA6IHByb2R1Y2VyLT5tX3ByZWZpeGVzICkgeworICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWIgOiBhdmFpbGFibGVTdWJzKSB7CisgICAgICAgIGlmIChwcmVmaXguZmlyc3QgIT0gc3ViKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZAorICBhZGRVc2VyTm9kZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwgaW50IG51bU9mVXNlck5vZGVzKQorICB7CisgICAgLy8gemVyb3RoIGlzIGFkZGVkIHRocm91Z2ggY29uc3RydWN0b3IKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG51bU9mVXNlck5vZGVzOyBpKyspIHsKKyAgICAgIHByb2R1Y2VyLT5hZGRVc2VyTm9kZShwcmVmaXggKyAiLSIgKyB0b19zdHJpbmcoaSkpOworICAgIH0KKyAgfQorCisgIHZvaWQKKyAgcHVibGlzaFVwZGF0ZUZvcihjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4KQorICB7CisgICAgb2xkU2VxTWFwID0gcHJvZHVjZXItPm1fcHJlZml4ZXM7CisgICAgcHJvZHVjZXItPnB1Ymxpc2hOYW1lKHByZWZpeCk7CisgICAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworICB9CisKKyAgdm9pZAorICB1cGRhdGVTZXFGb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCwgdWludDY0X3Qgc2VxKQorICB7CisgICAgb2xkU2VxTWFwID0gcHJvZHVjZXItPm1fcHJlZml4ZXM7CisgICAgcHJvZHVjZXItPnVwZGF0ZVNlcU5vKHByZWZpeCwgc2VxKTsKKyAgfQorCisgIHV0aWw6OkR1bW15Q2xpZW50RmFjZSBmYWNlOworICBOYW1lIHN5bmNQcmVmaXg7CisgIE5hbWUgdXNlclByZWZpeDsKKworICBzaGFyZWRfcHRyPFBhcnRpYWxQcm9kdWNlcj4gcHJvZHVjZXI7CisgIHN0ZDo6bWFwIDxuZG46Ok5hbWUsIHVpbnQ2NF90PiBvbGRTZXFNYXA7CisKKyAgc2hhcmVkX3B0cjxDb25zdW1lcj4gY29uc3VtZXJzWzNdOworICBzaGFyZWRfcHRyPHV0aWw6OkR1bW15Q2xpZW50RmFjZT4gY29uc3VtZXJGYWNlc1szXTsKKyAgaW50IG51bUhlbGxvRGF0YVJjdmQ7CisgIGludCBudW1TeW5jRGF0YVJjdmQ7Cit9OworCitCT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoUGFydGlhbFN5bmMsIFBhcnRpYWxTeW5jRml4dHVyZSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoU2ltcGxlKQoreworICB2ZWN0b3I8c3RyaW5nPiBzdWJzY3JpYmVUb3sidGVzdFVzZXItMiIsICJ0ZXN0VXNlci00IiwgInRlc3RVc2VyLTYifTsKKyAgYWRkQ29uc3VtZXIoMCwgc3Vic2NyaWJlVG8pOworCisgIGNvbnN1bWVyc1swXS0+c2VuZEhlbGxvSW50ZXJlc3QoKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworICBCT09TVF9DSEVDS19FUVVBTChudW1IZWxsb0RhdGFSY3ZkLCAxKTsKKworICBwdWJsaXNoVXBkYXRlRm9yKCJ0ZXN0VXNlci0yIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG51bVN5bmNEYXRhUmN2ZCwgMSk7CisgIHB1Ymxpc2hVcGRhdGVGb3IoInRlc3RVc2VyLTMiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtU3luY0RhdGFSY3ZkLCAxKTsKKyAgcHVibGlzaFVwZGF0ZUZvcigidGVzdFVzZXItMiIpOworICBCT09TVF9DSEVDS19FUVVBTChudW1TeW5jRGF0YVJjdmQsIDIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShNaXNzZWRVcGRhdGUpCit7CisgIHZlY3RvcjxzdHJpbmc+IHN1YnNjcmliZVRveyJ0ZXN0VXNlci0yIiwgInRlc3RVc2VyLTQiLCAidGVzdFVzZXItNiJ9OworICBhZGRDb25zdW1lcigwLCBzdWJzY3JpYmVUbyk7CisKKyAgY29uc3VtZXJzWzBdLT5zZW5kSGVsbG9JbnRlcmVzdCgpOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG51bUhlbGxvRGF0YVJjdmQsIDEpOworCisgIHVwZGF0ZVNlcUZvcigidGVzdFVzZXItMiIsIDMpOworICBCT09TVF9DSEVDS19FUVVBTChudW1TeW5jRGF0YVJjdmQsIDApOworCisgIC8vIFRoZSBzeW5jIGludGVyZXN0IHNlbnQgYWZ0ZXIgaGVsbG8gd2lsbCB0aW1lb3V0CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTAwMCkpOworICBCT09TVF9DSEVDS19FUVVBTChudW1TeW5jRGF0YVJjdmQsIDApOworCisgIC8vIE5leHQgc3luYyBpbnRlcmVzdCB3aWxsIGJyaW5nIGJhY2sgdGhlIHN5bmMgZGF0YQorICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwMDApKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtU3luY0RhdGFSY3ZkLCAxKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTGF0ZVN1YnNjcmlwdGlvbikKK3sKKyAgdmVjdG9yPHN0cmluZz4gc3Vic2NyaWJlVG97InRlc3RVc2VyLTIiLCAidGVzdFVzZXItNCIsICJ0ZXN0VXNlci02In07CisgIGFkZENvbnN1bWVyKDAsIHN1YnNjcmliZVRvKTsKKworICBjb25zdW1lcnNbMF0tPnNlbmRIZWxsb0ludGVyZXN0KCk7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApKTsKKworICBCT09TVF9DSEVDS19FUVVBTChudW1IZWxsb0RhdGFSY3ZkLCAxKTsKKyAgcHVibGlzaFVwZGF0ZUZvcigidGVzdFVzZXItMiIpOworICBCT09TVF9DSEVDS19FUVVBTChudW1TeW5jRGF0YVJjdmQsIDEpOworCisgIGNvbnN1bWVyc1swXS0+YWRkU3Vic2NyaXB0aW9uKCJ0ZXN0VXNlci0zIik7CisgIGNvbnN1bWVyc1swXS0+c2VuZFN5bmNJbnRlcmVzdCgpOworICBwdWJsaXNoVXBkYXRlRm9yKCJ0ZXN0VXNlci0zIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG51bVN5bmNEYXRhUmN2ZCwgMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKENvbnN1bWVyU3luY1RpbWVvdXQpCit7CisgIHZlY3RvcjxzdHJpbmc+IHN1YnNjcmliZVRveyJ0ZXN0VXNlci0yIiwgInRlc3RVc2VyLTQiLCAidGVzdFVzZXItNiJ9OworICBhZGRDb25zdW1lcigwLCBzdWJzY3JpYmVUbyk7CisKKyAgY29uc3VtZXJzWzBdLT5zZW5kSGVsbG9JbnRlcmVzdCgpOworICBCT09TVF9DSEVDS19FUVVBTChwcm9kdWNlci0+bV9wZW5kaW5nRW50cmllcy5zaXplKCksIDApOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHByb2R1Y2VyLT5tX3BlbmRpbmdFbnRyaWVzLnNpemUoKSwgMSk7CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApLCAxMDApOworICBCT09TVF9DSEVDS19FUVVBTChwcm9kdWNlci0+bV9wZW5kaW5nRW50cmllcy5zaXplKCksIDApOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSwgMTAwKTsKKworICBpbnQgbnVtU3luY0ludGVyZXN0cyA9IDA7CisgIGZvciAoY29uc3QgYXV0byYgaW50ZXJlc3QgOiBjb25zdW1lckZhY2VzWzBdLT5zZW50SW50ZXJlc3RzKSB7CisgICAgaWYgKGludGVyZXN0LmdldE5hbWUoKS5nZXRTdWJOYW1lKDAsIDIpID09IE5hbWUoIi9wc3luYy9zeW5jIikpIHsKKyAgICAgIG51bVN5bmNJbnRlcmVzdHMrKzsKKyAgICB9CisgIH0KKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtU3luY0ludGVyZXN0cywgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG51bVN5bmNEYXRhUmN2ZCwgMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKE11bHRpcGxlQ29uc3VtZXJzV2l0aFNhbWVTdWJMaXN0KQoreworICB2ZWN0b3I8c3RyaW5nPiBzdWJzY3JpYmVUb3sidGVzdFVzZXItMiIsICJ0ZXN0VXNlci00IiwgInRlc3RVc2VyLTYifTsKKyAgYWRkQ29uc3VtZXIoMCwgc3Vic2NyaWJlVG8pOworICBhZGRDb25zdW1lcigxLCBzdWJzY3JpYmVUbyk7CisgIGFkZENvbnN1bWVyKDIsIHN1YnNjcmliZVRvKTsKKworICBjb25zdW1lcnNbMF0tPnNlbmRIZWxsb0ludGVyZXN0KCk7CisgIGNvbnN1bWVyc1sxXS0+c2VuZEhlbGxvSW50ZXJlc3QoKTsKKyAgY29uc3VtZXJzWzJdLT5zZW5kSGVsbG9JbnRlcmVzdCgpOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtSGVsbG9EYXRhUmN2ZCwgMyk7CisKKyAgcHVibGlzaFVwZGF0ZUZvcigidGVzdFVzZXItMiIpOworICBCT09TVF9DSEVDS19FUVVBTChudW1TeW5jRGF0YVJjdmQsIDMpOworCisgIHB1Ymxpc2hVcGRhdGVGb3IoInRlc3RVc2VyLTMiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtU3luY0RhdGFSY3ZkLCAzKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoTXVsdGlwbGVDb25zdW1lcnNXaXRoRGlmZmVyZW50U3ViTGlzdCkKK3sKKyAgdmVjdG9yPHN0cmluZz4gc3Vic2NyaWJlVG97InRlc3RVc2VyLTIiLCAidGVzdFVzZXItNCIsICJ0ZXN0VXNlci02In07CisgIGFkZENvbnN1bWVyKDAsIHN1YnNjcmliZVRvKTsKKworICB2ZWN0b3I8c3RyaW5nPiBzdWJzY3JpYmVUbzF7InRlc3RVc2VyLTEiLCAidGVzdFVzZXItMyIsICJ0ZXN0VXNlci01In07CisgIGFkZENvbnN1bWVyKDEsIHN1YnNjcmliZVRvMSk7CisKKyAgdmVjdG9yPHN0cmluZz4gc3Vic2NyaWJlVG8yeyJ0ZXN0VXNlci0yIiwgInRlc3RVc2VyLTMifTsKKyAgYWRkQ29uc3VtZXIoMiwgc3Vic2NyaWJlVG8yKTsKKworICBjb25zdW1lcnNbMF0tPnNlbmRIZWxsb0ludGVyZXN0KCk7CisgIGNvbnN1bWVyc1sxXS0+c2VuZEhlbGxvSW50ZXJlc3QoKTsKKyAgY29uc3VtZXJzWzJdLT5zZW5kSGVsbG9JbnRlcmVzdCgpOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtSGVsbG9EYXRhUmN2ZCwgMyk7CisKKyAgcHVibGlzaFVwZGF0ZUZvcigidGVzdFVzZXItMiIpOworICBCT09TVF9DSEVDS19FUVVBTChudW1TeW5jRGF0YVJjdmQsIDIpOworCisgIG51bVN5bmNEYXRhUmN2ZCA9IDA7CisgIHB1Ymxpc2hVcGRhdGVGb3IoInRlc3RVc2VyLTMiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtU3luY0RhdGFSY3ZkLCAyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoUmVwbGljYXRlZFByb2R1Y2VyKQoreworICB2ZWN0b3I8c3RyaW5nPiBzdWJzY3JpYmVUb3sidGVzdFVzZXItMiIsICJ0ZXN0VXNlci00IiwgInRlc3RVc2VyLTYifTsKKyAgYWRkQ29uc3VtZXIoMCwgc3Vic2NyaWJlVG8pOworCisgIGNvbnN1bWVyc1swXS0+c2VuZEhlbGxvSW50ZXJlc3QoKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworICBCT09TVF9DSEVDS19FUVVBTChudW1IZWxsb0RhdGFSY3ZkLCAxKTsKKworICBwdWJsaXNoVXBkYXRlRm9yKCJ0ZXN0VXNlci0yIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG51bVN5bmNEYXRhUmN2ZCwgMSk7CisKKyAgLy8gTGluayB0byBmaXJzdCBwcm9kdWNlciBnb2VzIGRvd24KKyAgZmFjZS51bmxpbmsoKTsKKworICB1dGlsOjpEdW1teUNsaWVudEZhY2UgZmFjZTIoaW8sIHt0cnVlLCB0cnVlfSk7CisgIFBhcnRpYWxQcm9kdWNlciByZXBsaWNhdGVkUHJvZHVjZXIoNDAsIGZhY2UyLCBzeW5jUHJlZml4LCB1c2VyUHJlZml4KTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCAxMDsgaSsrKSB7CisgICAgICByZXBsaWNhdGVkUHJvZHVjZXIuYWRkVXNlck5vZGUoInRlc3RVc2VyLSIgKyB0b19zdHJpbmcoaSkpOworICB9CisgIGFkdmFuY2VDbG9ja3MobmRuOjp0aW1lOjptaWxsaXNlY29uZHMoMTApKTsKKyAgcmVwbGljYXRlZFByb2R1Y2VyLnB1Ymxpc2hOYW1lKCJ0ZXN0VXNlci0yIik7CisgIC8vIExpbmsgdG8gYSByZXBsaWNhdGVkIHByb2R1Y2VyIGNvbWVzIHVwCisgIGZhY2UyLmxpbmtUbygqY29uc3VtZXJGYWNlc1swXSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFjZTIuc2VudERhdGEuc2l6ZSgpLCAwKTsKKworICAvLyBVcGRhdGUgaW4gZmlyc3QgcHJvZHVjZXIgYXMgd2VsbCBzbyBjb25zdW1lciBvbiBzeW5jIGRhdGEKKyAgLy8gY2FsbGJhY2sgY2hlY2tzIHN0aWxsIHBhc3MKKyAgcHVibGlzaFVwZGF0ZUZvcigidGVzdFVzZXItMiIpOworICByZXBsaWNhdGVkUHJvZHVjZXIucHVibGlzaE5hbWUoInRlc3RVc2VyLTIiKTsKKyAgYWR2YW5jZUNsb2NrcyhuZG46OnRpbWU6Om1pbGxpc2Vjb25kcygxNSksIDEwMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG51bVN5bmNEYXRhUmN2ZCwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGZhY2UyLnNlbnREYXRhLnNpemUoKSwgMSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEFwcGxpY2F0aW9uTmFjaykKK3sKKyAgLy8gNTAgaXMgbW9yZSB0aGFuIGV4cGVjdGVkIG51bWJlciBvZiBlbnRyaWVzIG9mIDQwIGluIHRoZSBwcm9kdWNlcidzIElCRgorICBhZGRVc2VyTm9kZXMoInRlc3RVc2VyIiwgNTApOworCisgIHZlY3RvcjxzdHJpbmc+IHN1YnNjcmliZVRveyJ0ZXN0VXNlci0yIiwgInRlc3RVc2VyLTQiLCAidGVzdFVzZXItNiJ9OworICBhZGRDb25zdW1lcigwLCBzdWJzY3JpYmVUbyk7CisKKyAgY29uc3VtZXJzWzBdLT5zZW5kSGVsbG9JbnRlcmVzdCgpOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG51bUhlbGxvRGF0YVJjdmQsIDEpOworCisgIHB1Ymxpc2hVcGRhdGVGb3IoInRlc3RVc2VyLTIiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtU3luY0RhdGFSY3ZkLCAxKTsKKworICBvbGRTZXFNYXAgPSBwcm9kdWNlci0+bV9wcmVmaXhlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisgICAgbmRuOjpOYW1lIHByZWZpeCgidGVzdFVzZXItIiArIHRvX3N0cmluZyhpKSk7CisgICAgcHJvZHVjZXItPnVwZGF0ZVNlcU5vKHByZWZpeCwgcHJvZHVjZXItPmdldFNlcU5vKHByZWZpeCkudmFsdWUoKSArIDEpOworICB9CisgIC8vIE5leHQgc3luYyBpbnRlcmVzdCBzaG91bGQgdHJpZ2dlciB0aGUgbmFjaworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDE1KSwgMTAwKTsKKworICAvLyBOYWNrIGRvZXMgbm90IGNvbnRhaW4gYW55IGNvbnRlbnQgc28gc3RpbGwgc2hvdWxkIGJlIDEKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtU3luY0RhdGFSY3ZkLCAxKTsKKworICBib29sIG5hY2tSY3ZkID0gZmFsc2U7CisgIGZvciAoY29uc3QgYXV0byYgZGF0YSA6IGZhY2Uuc2VudERhdGEpIHsKKyAgICBpZiAoZGF0YS5nZXRDb250ZW50VHlwZSgpID09IG5kbjo6dGx2OjpDb250ZW50VHlwZV9OYWNrKSB7CisgICAgICBuYWNrUmN2ZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgQk9PU1RfQ0hFQ0sobmFja1JjdmQpOworCisgIHByb2R1Y2VyLT5wdWJsaXNoTmFtZSgidGVzdFVzZXItNCIpOworICBhZHZhbmNlQ2xvY2tzKG5kbjo6dGltZTo6bWlsbGlzZWNvbmRzKDEwKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG51bVN5bmNEYXRhUmN2ZCwgMik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSBwc3luYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3QtcHJvZHVjZXItYmFzZS5jcHAgYi90ZXN0cy90ZXN0LXByb2R1Y2VyLWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjRiMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90ZXN0LXByb2R1Y2VyLWJhc2UuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qIC0qLSBNb2RlOkMrKzsgYy1maWxlLXN0eWxlOiJnbnUiOyBpbmRlbnQtdGFicy1tb2RlOm5pbDsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgUFN5bmMuCisgKiBTZWUgQVVUSE9SUy5tZCBmb3IgY29tcGxldGUgbGlzdCBvZiBQU3luYyBhdXRob3JzIGFuZCBjb250cmlidXRvcnMuCisgKgorICogUFN5bmMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogUFN5bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogUFN5bmMsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqKi8KKworI2luY2x1ZGUgInByb2R1Y2VyLWJhc2UuaHBwIgorI2luY2x1ZGUgImRldGFpbC91dGlsLmhwcCIKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L25hbWUuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvZGF0YS5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC9pbnRlcmVzdC5ocHA+CisjaW5jbHVkZSA8bmRuLWN4eC91dGlsL2R1bW15LWNsaWVudC1mYWNlLmhwcD4KKworbmFtZXNwYWNlIHBzeW5jIHsKKwordXNpbmcgbmFtZXNwYWNlIG5kbjsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRlc3RQcm9kdWNlckJhc2UpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEN0b3IpCit7CisgIHV0aWw6OkR1bW15Q2xpZW50RmFjZSBmYWNlOworICBCT09TVF9SRVFVSVJFX05PX1RIUk9XKFByb2R1Y2VyQmFzZSg0MCwgZmFjZSwgTmFtZSgiL3BzeW5jIiksIE5hbWUoIi90ZXN0VXNlciIpKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEJhc2ljKQoreworICB1dGlsOjpEdW1teUNsaWVudEZhY2UgZmFjZTsKKyAgTmFtZSB1c2VyTm9kZSgiL3Rlc3RVc2VyIik7CisgIFByb2R1Y2VyQmFzZSBwcm9kdWNlckJhc2UoNDAsIGZhY2UsIE5hbWUoIi9wc3luYyIpLCB1c2VyTm9kZSk7CisgIC8vIEhhc2ggdGFibGUgc2l6ZSBzaG91bGQgYmUgNDAgKyA0MC8yID0gNjAgKHdoaWNoIGlzIHBlcmZlY3RseSBkaXZpc2libGUgYnkgTl9IQVNIID0gMykKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocHJvZHVjZXJCYXNlLm1faWJsdC5nZXRIYXNoVGFibGUoKS5zaXplKCksIDYwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocHJvZHVjZXJCYXNlLmdldFNlcU5vKHVzZXJOb2RlKS52YWx1ZSgpLCAwKTsKKworICBwcm9kdWNlckJhc2UudXBkYXRlU2VxTm8odXNlck5vZGUsIDEpOworICBCT09TVF9DSEVDSyhwcm9kdWNlckJhc2UuZ2V0U2VxTm8odXNlck5vZGUudG9VcmkoKSkudmFsdWUoKSA9PSAxKTsKKworICBzdGQ6OnN0cmluZyBwcmVmaXhXaXRoU2VxID0gTmFtZSh1c2VyTm9kZSkuYXBwZW5kTnVtYmVyKDEpLnRvVXJpKCk7CisgIHVpbnQzMl90IGhhc2ggPSBwcm9kdWNlckJhc2UubV9wcmVmaXgyaGFzaFtwcmVmaXhXaXRoU2VxXTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwocHJvZHVjZXJCYXNlLm1faGFzaDJwcmVmaXhbaGFzaF0sIHVzZXJOb2RlLnRvVXJpKCkpOworCisgIHByb2R1Y2VyQmFzZS5yZW1vdmVVc2VyTm9kZSh1c2VyTm9kZSk7CisgIEJPT1NUX0NIRUNLKHByb2R1Y2VyQmFzZS5nZXRTZXFObyh1c2VyTm9kZS50b1VyaSgpKSA9PSBuZG46Om51bGxvcHQpOworICBCT09TVF9DSEVDSyhwcm9kdWNlckJhc2UubV9wcmVmaXgyaGFzaC5maW5kKHByZWZpeFdpdGhTZXEpID09IHByb2R1Y2VyQmFzZS5tX3ByZWZpeDJoYXNoLmVuZCgpKTsKKyAgQk9PU1RfQ0hFQ0socHJvZHVjZXJCYXNlLm1faGFzaDJwcmVmaXguZmluZChoYXNoKSA9PSBwcm9kdWNlckJhc2UubV9oYXNoMnByZWZpeC5lbmQoKSk7CisKKyAgTmFtZSBub25FeGlzdGVudFVzZXJOb2RlKCIvbm90QVVzZXIiKTsKKyAgcHJvZHVjZXJCYXNlLnVwZGF0ZVNlcU5vKG5vbkV4aXN0ZW50VXNlck5vZGUsIDEpOworICBCT09TVF9DSEVDSyhwcm9kdWNlckJhc2UubV9wcmVmaXgyaGFzaC5maW5kKE5hbWUobm9uRXhpc3RlbnRVc2VyTm9kZSkuYXBwZW5kTnVtYmVyKDEpLnRvVXJpKCkpID09CisgICAgICAgICAgICAgIHByb2R1Y2VyQmFzZS5tX3ByZWZpeDJoYXNoLmVuZCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoQXBwbGljYXRpb25OYWNrKQoreworICB1dGlsOjpEdW1teUNsaWVudEZhY2UgZmFjZTsKKyAgUHJvZHVjZXJCYXNlIHByb2R1Y2VyQmFzZSg0MCwgZmFjZSwgTmFtZSgiL3BzeW5jIiksIE5hbWUoIi90ZXN0VXNlciIpKTsKKworICBCT09TVF9DSEVDS19FUVVBTChmYWNlLnNlbnREYXRhLnNpemUoKSwgMCk7CisgIHByb2R1Y2VyQmFzZS5tX3N5bmNSZXBseUZyZXNobmVzcyA9IHRpbWU6Om1pbGxpc2Vjb25kcygxMDAwKTsKKyAgcHJvZHVjZXJCYXNlLnNlbmRBcHBsaWNhdGlvbk5hY2soTmFtZSgidGVzdCIpKTsKKyAgZmFjZS5wcm9jZXNzRXZlbnRzKHRpbWU6Om1pbGxpc2Vjb25kcygxMCkpOworICBCT09TVF9DSEVDS19FUVVBTChmYWNlLnNlbnREYXRhLnNpemUoKSwgMSk7CisKKyAgRGF0YSBkYXRhID0gKmZhY2Uuc2VudERhdGEuYmVnaW4oKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YS5nZXRDb250ZW50VHlwZSgpLCBuZG46OnRsdjo6Q29udGVudFR5cGVfTmFjayk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQorCit9IC8vIG5hbWVzcGFjZSBwc3luYwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdC1zdGF0ZS5jcHAgYi90ZXN0cy90ZXN0LXN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2MxNDcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdGVzdC1zdGF0ZS5jcHAKQEAgLTAsMCArMSw0NyBAQAorLyogLSotIE1vZGU6QysrOyBjLWZpbGUtc3R5bGU6ImdudSI7IGluZGVudC10YWJzLW1vZGU6bmlsOyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCwgIFRoZSBVbml2ZXJzaXR5IG9mIE1lbXBoaXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBQU3luYy4KKyAqIFNlZSBBVVRIT1JTLm1kIGZvciBjb21wbGV0ZSBsaXN0IG9mIFBTeW5jIGF1dGhvcnMgYW5kIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiBQU3luYyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBQU3luYyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7CisgKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiBQU3luYywgZS5nLiwgaW4gQ09QWUlORy5tZCBmaWxlLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoqLworCisjaW5jbHVkZSAiZGV0YWlsL3N0YXRlLmhwcCIKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxuZG4tY3h4L25hbWUuaHBwPgorI2luY2x1ZGUgPG5kbi1jeHgvZGF0YS5ocHA+CisKK25hbWVzcGFjZSBwc3luYyB7CisKK3VzaW5nIG5hbWVzcGFjZSBuZG47CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUZXN0U3RhdGUpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKEVuY29kZURlb2RlKQoreworICBTdGF0ZSBzdGF0ZTsKKyAgc3RhdGUuYWRkQ29udGVudChuZG46Ok5hbWUoInRlc3QxIikpOworICBzdGF0ZS5hZGRDb250ZW50KG5kbjo6TmFtZSgidGVzdDIiKSk7CisKKyAgbmRuOjpEYXRhIGRhdGE7CisgIGRhdGEuc2V0Q29udGVudChzdGF0ZS53aXJlRW5jb2RlKCkpOworICBTdGF0ZSByY3ZkU3RhdGUoZGF0YS5nZXRDb250ZW50KCkpOworCisgIEJPT1NUX0NIRUNLKHN0YXRlLmdldENvbnRlbnQoKSA9PSByY3ZkU3RhdGUuZ2V0Q29udGVudCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisKK30gLy8gbmFtZXNwYWNlIHBzeW5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvdW5pdC10ZXN0LXRpbWUtZml4dHVyZS5ocHAgYi90ZXN0cy91bml0LXRlc3QtdGltZS1maXh0dXJlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjI5M2E4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdW5pdC10ZXN0LXRpbWUtZml4dHVyZS5ocHAKQEAgLTAsMCArMSw2NyBAQAorLyogLSotIE1vZGU6IEMrKzsgYy1maWxlLXN0eWxlOiAiZ251IjsgaW5kZW50LXRhYnMtbW9kZTpuaWwgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTggIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgTG9zIEFuZ2VsZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVW5pdmVyc2l0eSBvZiBNZW1waGlzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgUFN5bmMuCisgKgorICogUFN5bmMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyCisgKiB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogUFN5bmMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOworICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogUFN5bmMsIGUuZy4sIGluIENPUFlJTkcubWQgZmlsZS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIE5ETl9URVNUU19VTklUX1RFU1RTX1VOSVRfVEVTVF9USU1FX0ZJWFRVUkVfSFBQCisjZGVmaW5lIE5ETl9URVNUU19VTklUX1RFU1RTX1VOSVRfVEVTVF9USU1FX0ZJWFRVUkVfSFBQCisKKyNpbmNsdWRlIDxuZG4tY3h4L3V0aWwvdGltZS11bml0LXRlc3QtY2xvY2suaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvYXNpby5ocHA+CisKK25hbWVzcGFjZSBuZG4geworbmFtZXNwYWNlIHRlc3RzIHsKKworY2xhc3MgVW5pdFRlc3RUaW1lRml4dHVyZQoreworcHVibGljOgorICBVbml0VGVzdFRpbWVGaXh0dXJlKCkKKyAgICA6IHN0ZWFkeUNsb2NrKG1ha2Vfc2hhcmVkPHRpbWU6OlVuaXRUZXN0U3RlYWR5Q2xvY2s+KCkpCisgICAgLCBzeXN0ZW1DbG9jayhtYWtlX3NoYXJlZDx0aW1lOjpVbml0VGVzdFN5c3RlbUNsb2NrPigpKQorICB7CisgICAgdGltZTo6c2V0Q3VzdG9tQ2xvY2tzKHN0ZWFkeUNsb2NrLCBzeXN0ZW1DbG9jayk7CisgIH0KKworICB+VW5pdFRlc3RUaW1lRml4dHVyZSgpCisgIHsKKyAgICB0aW1lOjpzZXRDdXN0b21DbG9ja3MobnVsbHB0ciwgbnVsbHB0cik7CisgIH0KKworICB2b2lkCisgIGFkdmFuY2VDbG9ja3MoY29uc3QgdGltZTo6bmFub3NlY29uZHMmIHRpY2ssIHNpemVfdCBuVGlja3MgPSAxKQorICB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuVGlja3M7ICsraSkgeworICAgICAgc3RlYWR5Q2xvY2stPmFkdmFuY2UodGljayk7CisgICAgICBzeXN0ZW1DbG9jay0+YWR2YW5jZSh0aWNrKTsKKworICAgICAgaWYgKGlvLnN0b3BwZWQoKSkKKyAgICAgICAgaW8ucmVzZXQoKTsKKyAgICAgIGlvLnBvbGwoKTsKKyAgICB9CisgIH0KKworcHVibGljOgorICBzaGFyZWRfcHRyPHRpbWU6OlVuaXRUZXN0U3RlYWR5Q2xvY2s+IHN0ZWFkeUNsb2NrOworICBzaGFyZWRfcHRyPHRpbWU6OlVuaXRUZXN0U3lzdGVtQ2xvY2s+IHN5c3RlbUNsb2NrOworICBib29zdDo6YXNpbzo6aW9fc2VydmljZSBpbzsKK307CisKK30gLy8gbmFtZXNwYWNlIHRlc3RzCit9IC8vIG5hbWVzcGFjZSBuZG4KKworI2VuZGlmIC8vIE5ETl9URVNUU19VTklUX1RFU1RTX1VOSVRfVEVTVF9USU1FX0ZJWFRVUkVfSFBQCmRpZmYgLS1naXQgYS90ZXN0cy93c2NyaXB0IGIvdGVzdHMvd3NjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWNhZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvd3NjcmlwdApAQCAtMCwwICsxLDIyIEBACit0b3AgPSAnLi4nCisKK2RlZiBidWlsZChibGQpOgorICAgIGlmIG5vdCBibGQuZW52WydXSVRIX1RFU1RTJ106CisgICAgICAgIHJldHVybgorCisgICAgYmxkKAorICAgICAgICBmZWF0dXJlcz0nY3h4JywKKyAgICAgICAgbmFtZT0ndW5pdC10ZXN0cy1tYWluJywKKyAgICAgICAgdGFyZ2V0PSd1bml0LXRlc3RzLW1haW4nLAorICAgICAgICBzb3VyY2U9J21haW4uY3BwJywKKyAgICAgICAgZGVmaW5lcz1bJ0JPT1NUX1RFU1RfTU9EVUxFPVBTeW5jIFVuaXQgVGVzdHMnXSwKKyAgICAgICAgdXNlPSdQU3luYycKKyAgICApCisKKyAgICBibGQucHJvZ3JhbSgKKyAgICAgICAgdGFyZ2V0PScuLi91bml0LXRlc3RzJywKKyAgICAgICAgZmVhdHVyZXM9J2N4eCBjeHhwcm9ncmFtJywKKyAgICAgICAgc291cmNlPWJsZC5wYXRoLmFudF9nbG9iKFsnKiovKi5jcHAnXSwgZXhjbD1bJ21haW4uY3BwJ10pLAorICAgICAgICB1c2U9J1BTeW5jIHVuaXQtdGVzdHMtbWFpbicsCisgICAgICAgIGluc3RhbGxfcGF0aD1Ob25lLAorICAgICkKZGlmZiAtLWdpdCBhL3dhZiBiL3dhZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZjBkMjRlCi0tLSAvZGV2L251bGwKKysrIGIvd2FmCkBAIC0wLDAgKzEsMTcwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgZW5jb2Rpbmc6IGxhdGluLTEKKyMgVGhvbWFzIE5hZ3ksIDIwMDUtMjAxOAorIworIiIiCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKzMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKK1NFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCitJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIiIiCisKK2ltcG9ydCBvcywgc3lzLCBpbnNwZWN0CisKK1ZFUlNJT049IjIuMC42IgorUkVWSVNJT049IjU5MzE5MWY0OTZmZThjNjYyMzFkZmQ1ZGYyNjE2N2FlIgorR0lUPSI0NTlkZGY1MGI2MjI1NzNlY2ZlMzZjMTJjMDc2ZTBmY2M2MTBiMDFlIgorSU5TVEFMTD0nJworQzE9JyMyJworQzI9JyMmJworQzM9JyMlJworY3dkID0gb3MuZ2V0Y3dkKCkKK2pvaW4gPSBvcy5wYXRoLmpvaW4KKworCitXQUY9J3dhZicKK2RlZiBiKHgpOgorCXJldHVybiB4CitpZiBzeXMuaGV4dmVyc2lvbj4weDMwMDAwMGY6CisJV0FGPSd3YWYzJworCWRlZiBiKHgpOgorCQlyZXR1cm4geC5lbmNvZGUoKQorCitkZWYgZXJyKG0pOgorCXByaW50KCgnXDAzM1s5MW1FcnJvcjogJXNcMDMzWzBtJyAlIG0pKQorCXN5cy5leGl0KDEpCisKK2RlZiB1bnBhY2tfd2FmZGlyKGRpciwgc3JjKToKKwlmID0gb3BlbihzcmMsJ3JiJykKKwljID0gJ2NvcnJ1cHQgYXJjaGl2ZSAoJWQpJworCXdoaWxlIDE6CisJCWxpbmUgPSBmLnJlYWRsaW5lKCkKKwkJaWYgbm90IGxpbmU6IGVycigncnVuIHdhZi1saWdodCBmcm9tIGEgZm9sZGVyIGNvbnRhaW5pbmcgd2FmbGliJykKKwkJaWYgbGluZSA9PSBiKCcjPT0+XG4nKToKKwkJCXR4dCA9IGYucmVhZGxpbmUoKQorCQkJaWYgbm90IHR4dDogZXJyKGMgJSAxKQorCQkJaWYgZi5yZWFkbGluZSgpICE9IGIoJyM8PT1cbicpOiBlcnIoYyAlIDIpCisJCQlicmVhaworCWlmIG5vdCB0eHQ6IGVycihjICUgMykKKwl0eHQgPSB0eHRbMTotMV0ucmVwbGFjZShiKEMxKSwgYignXG4nKSkucmVwbGFjZShiKEMyKSwgYignXHInKSkucmVwbGFjZShiKEMzKSwgYignXHgwMCcpKQorCisJaW1wb3J0IHNodXRpbCwgdGFyZmlsZQorCXRyeTogc2h1dGlsLnJtdHJlZShkaXIpCisJZXhjZXB0IE9TRXJyb3I6IHBhc3MKKwl0cnk6CisJCWZvciB4IGluICgnVG9vbHMnLCAnZXh0cmFzJyk6CisJCQlvcy5tYWtlZGlycyhqb2luKGRpciwgJ3dhZmxpYicsIHgpKQorCWV4Y2VwdCBPU0Vycm9yOgorCQllcnIoIkNhbm5vdCB1bnBhY2sgd2FmIGxpYiBpbnRvICVzXG5Nb3ZlIHdhZiBpbiBhIHdyaXRhYmxlIGRpcmVjdG9yeSIgJSBkaXIpCisKKwlvcy5jaGRpcihkaXIpCisJdG1wID0gJ3QuYnoyJworCXQgPSBvcGVuKHRtcCwnd2InKQorCXRyeTogdC53cml0ZSh0eHQpCisJZmluYWxseTogdC5jbG9zZSgpCisKKwl0cnk6CisJCXQgPSB0YXJmaWxlLm9wZW4odG1wKQorCWV4Y2VwdDoKKwkJdHJ5OgorCQkJb3Muc3lzdGVtKCdidW56aXAyIHQuYnoyJykKKwkJCXQgPSB0YXJmaWxlLm9wZW4oJ3QnKQorCQkJdG1wID0gJ3QnCisJCWV4Y2VwdDoKKwkJCW9zLmNoZGlyKGN3ZCkKKwkJCXRyeTogc2h1dGlsLnJtdHJlZShkaXIpCisJCQlleGNlcHQgT1NFcnJvcjogcGFzcworCQkJZXJyKCJXYWYgY2Fubm90IGJlIHVucGFja2VkLCBjaGVjayB0aGF0IGJ6aXAyIHN1cHBvcnQgaXMgcHJlc2VudCIpCisKKwl0cnk6CisJCWZvciB4IGluIHQ6IHQuZXh0cmFjdCh4KQorCWZpbmFsbHk6CisJCXQuY2xvc2UoKQorCisJZm9yIHggaW4gKCdUb29scycsICdleHRyYXMnKToKKwkJb3MuY2htb2Qoam9pbignd2FmbGliJyx4KSwgNDkzKQorCisJaWYgc3lzLmhleHZlcnNpb248MHgzMDAwMDBmOgorCQlzeXMucGF0aCA9IFtqb2luKGRpciwgJ3dhZmxpYicpXSArIHN5cy5wYXRoCisJCWltcG9ydCBmaXhweTIKKwkJZml4cHkyLmZpeGRpcihkaXIpCisKKwlvcy5yZW1vdmUodG1wKQorCW9zLmNoZGlyKGN3ZCkKKworCXRyeTogZGlyID0gdW5pY29kZShkaXIsICdtYmNzJykKKwlleGNlcHQ6IHBhc3MKKwl0cnk6CisJCWZyb20gY3R5cGVzIGltcG9ydCB3aW5kbGwKKwkJd2luZGxsLmtlcm5lbDMyLlNldEZpbGVBdHRyaWJ1dGVzVyhkaXIsIDIpCisJZXhjZXB0OgorCQlwYXNzCisKK2RlZiB0ZXN0KGRpcik6CisJdHJ5OgorCQlvcy5zdGF0KGpvaW4oZGlyLCAnd2FmbGliJykpCisJCXJldHVybiBvcy5wYXRoLmFic3BhdGgoZGlyKQorCWV4Y2VwdCBPU0Vycm9yOgorCQlwYXNzCisKK2RlZiBmaW5kX2xpYigpOgorCXNyYyA9IG9zLnBhdGguYWJzcGF0aChpbnNwZWN0LmdldGZpbGUoaW5zcGVjdC5nZXRtb2R1bGUoZXJyKSkpCisJYmFzZSwgbmFtZSA9IG9zLnBhdGguc3BsaXQoc3JjKQorCisJI2RldnMgdXNlICRX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eS6fy/8BVJ/+cP8oAkFU9QIYgJlCe//wbH/ILeP7bb+Rt0izxBLloP/Lxv7f/v/8G0eZfn8fu/M7IyY8dCc1eqOXEh50u648z3jvw66EfF5nD3gfKQHsPKWF3o9Xm5DgTviM945L/42Dychq/7xAge4p5yGKPIkIH5/9dLuifol4AZwCj8TZFnw6snX/26Vb2LCEs3sXKFdRNun/9+sR2e8MqgPf5WYn/8agQ1xUuJIf3CNlH7alH/gotZwOldvE4qiKZwTfLVcLjLOYNTDvkcQ+PntOnbRAzoMrKx+/nLE3hG4YvLYSxvw8I0TiolrytpzCQYXgd/lwzByVhk02Pt0hL9T8rPPRRsvCXGQjMk+74+8ppZ8PDk28jtJ69j3afP/nrI8CnmozixQ2+pj1y1VjEE84Gmk/tp/kIVT1j6PeJCPxfQ9AiAJ//xdyRThQkBP8GKIKKyM8PT0KKyMtLS0tLUJFR0lOIFBHUCBTSUdOQVRVUkUtLS0tLVxuXG5pUUljQkFBQkNnQUdCUUphaWFzNEFBb0pFRW0weG53RkozcXFmbWNQL2o0SVRIR1hkM1U4dFJuNGhqdnBMTGtUXG5mVE1kOXg5aEJFd3dScVUwRVlvQXAyK3lJb1VLdmI1SkVSRjBZakdVV29pWnF4RW1HR3A1QkZTT0pPcllocTBWXG5zWklFMDF3clFRVFlNbjFqZm9YaGp5d3lMVmR5TXBsOWhnYjJaN0RuRjlHZ3pVc2Q1YlBXbW9OYUNNa2haanVEXG5TYVIxM0ZmMGhBT1ZJdC9mTm9KaVhZSjJJQ0RSRzVMR0tGbGt4eTB5a1hPa3JLRG1kYWg0RFY2TUdWQi90UzNuXG5pQmh4Z3FNYzlJTFNGUW9FUW1GQVhUaWQ4RWowT0JqK2NzQWs4bnZiQ0VpVitrNzRCb3pwUStRVmZSK2FnWCtLXG5uZi9vTWVkOEYxakthOXV5ZGJ2Y0VuNFNYWEVCcUt6dGlLdnVDR21aSU8zeEtkKzQ2KzVPaDUxd0t4WllOc3lrXG5sWUJBQS9mSDhmT1pxTXpUQ1JHWk0zcTZFbktmK3p3R3lmNGxGT0h1VnplWEhsZmNaQTYyVjFUY3I5YVFmc3EwXG4yc2FJOVM5SnN4RXBGdkFhNFMreDdvUStWSjBXTTVYTGIwNEtLRmdBTWpLL2tXMk53NnJZUTBlTkNkQlg2TkNjXG42TFdubW1yQi9UYXVTTnNKU1lJZklDb0t1ditoZWJqYlNJUWE1bjEvelFlV1l0OERLWllTOUxrd2wzNHZNTWR4XG5EenEvbDdRTCtJNVo1akRTVmt6UlMzMS9LNlQ2UldpWUZ6SGdhYndEL0ROQkM4Y2ZHNFJ3VFpJRU8zQzh1TEZ5XG5EbzBNRzh3NU5Ga01rN3QwS1F0QlBlKzdCSzZOdjZYbzVtTFRKKzAxSU52bWdIYXZoZ0g0YlN5ZzBrRDhNYkdTXG5ZNGNPRU1LblVrSFhDcHZYc09MelxuPTlYM2Jcbi0tLS0tRU5EIFBHUCBTSUdOQVRVUkUtLS0tLVxuCmRpZmYgLS1naXQgYS93c2NyaXB0IGIvd3NjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODE1ZGViCi0tLSAvZGV2L251bGwKKysrIGIvd3NjcmlwdApAQCAtMCwwICsxLDE3MSBAQAorIyAtKi0gTW9kZTogcHl0aG9uOyBweS1pbmRlbnQtb2Zmc2V0OiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGNvZGluZzogdXRmLTg7IC0qLQorCitmcm9tIHdhZmxpYiBpbXBvcnQgTG9ncywgVXRpbHMsIENvbnRleHQKK2ltcG9ydCBvcywgc3VicHJvY2VzcworCitWRVJTSU9OID0gJzAuMS4wJworQVBQTkFNRSA9ICdQU3luYycKK0dJVF9UQUdfUFJFRklYID0gJycKKworZGVmIG9wdGlvbnMob3B0KToKKyAgICBvcHQubG9hZChbJ2NvbXBpbGVyX2MnLCAnY29tcGlsZXJfY3h4JywgJ2dudV9kaXJzJ10pCisgICAgb3B0LmxvYWQoWydkZWZhdWx0LWNvbXBpbGVyLWZsYWdzJywgJ2Jvb3N0JywgJ2RveHlnZW4nLCAnc3BoaW54X2J1aWxkJywKKyAgICAgICAgICAgICAgJ3Nhbml0aXplcnMnLCAnY292ZXJhZ2UnLCAncGNoJ10sCisgICAgICAgICAgICAgdG9vbGRpcj1bJy53YWYtdG9vbHMnXSkKKworICAgIG9wdC5hZGRfb3B0aW9uKCctLXdpdGgtdGVzdHMnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZWZhdWx0PUZhbHNlLCBkZXN0PSd3aXRoX3Rlc3RzJywKKyAgICAgICAgICAgICAgICAgICBoZWxwPScnJ2J1aWxkIHVuaXQgdGVzdHMnJycpCisKK2RlZiBjb25maWd1cmUoY29uZik6CisgICAgY29uZi5sb2FkKFsnY29tcGlsZXJfYycsICdjb21waWxlcl9jeHgnLCAnZ251X2RpcnMnLCAnZGVmYXVsdC1jb21waWxlci1mbGFncycsCisgICAgICAgICAgICAgICAnYm9vc3QnLCAncGNoJywgJ2RveHlnZW4nLCAnc3BoaW54X2J1aWxkJ10pCisKKyAgICBpZiAnUEtHX0NPTkZJR19QQVRIJyBub3QgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgb3MuZW52aXJvblsnUEtHX0NPTkZJR19QQVRIJ10gPSBVdGlscy5zdWJzdF92YXJzKCcke0xJQkRJUn0vcGtnY29uZmlnJywgY29uZi5lbnYpCisKKyAgICBjb25mLmNoZWNrX2NmZyhwYWNrYWdlPSdsaWJuZG4tY3h4JywgYXJncz1bJy0tY2ZsYWdzJywgJy0tbGlicyddLAorICAgICAgICAgICAgICAgICAgIHVzZWxpYl9zdG9yZT0nTkROX0NYWCcsIG1hbmRhdG9yeT1UcnVlKQorCisgICAgYm9vc3RfbGlicyA9ICdzeXN0ZW0gdGhyZWFkIGxvZyBsb2dfc2V0dXAnCisgICAgaWYgY29uZi5vcHRpb25zLndpdGhfdGVzdHM6CisgICAgICAgIGNvbmYuZW52WydXSVRIX1RFU1RTJ10gPSAxCisgICAgICAgIGNvbmYuZGVmaW5lKCdXSVRIX1RFU1RTJywgMSk7CisgICAgICAgIGJvb3N0X2xpYnMgKz0gJyB1bml0X3Rlc3RfZnJhbWV3b3JrJworCisgICAgY29uZi5jaGVja19ib29zdChsaWI9Ym9vc3RfbGlicywgbXQ9VHJ1ZSkKKworICAgIGNvbmYuY2hlY2tfY29tcGlsZXJfZmxhZ3MoKQorCisgICAgY29uZi5sb2FkKCdjb3ZlcmFnZScpCisKKyAgICBjb25mLmxvYWQoJ3Nhbml0aXplcnMnKQorCisgICAgIyBJZiB0aGVyZSBoYXBwZW5zIHRvIGJlIGEgc3RhdGljIGxpYnJhcnksIHdhZiB3aWxsIHB1dCB0aGUgY29ycmVzcG9uZGluZyAtTCBmbGFncworICAgICMgYmVmb3JlIGR5bmFtaWMgbGlicmFyeSBmbGFncy4gIFRoaXMgY2FuIHJlc3VsdCBpbiBjb21waWxhdGlvbiBmYWlsdXJlIHdoZW4gdGhlCisgICAgIyBzeXN0ZW0gaGFzIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgdGhlIFBTeW5jIGxpYnJhcnkgaW5zdGFsbGVkLgorICAgIGNvbmYuZW52WydTVExJQlBBVEgnXSA9IFsnLiddICsgY29uZi5lbnZbJ1NUTElCUEFUSCddCisKKyAgICBjb25mLndyaXRlX2NvbmZpZ19oZWFkZXIoJ3BzeW5jLWNvbmZpZy5ocHAnKQorCitkZWYgYnVpbGQoYmxkKToKKyAgICBibGQuc2hsaWIoCisgICAgICAgIHRhcmdldD0nUFN5bmMnLAorICAgICAgICBzb3VyY2UgPSAgYmxkLnBhdGguYW50X2dsb2IoWydzcmMvKiovKi5jcHAnXSksCisgICAgICAgIHVzZSA9ICdCT09TVCBORE5fQ1hYJywKKyAgICAgICAgaW5jbHVkZXMgPSBbJ3NyYycsICcuJ10sCisgICAgICAgIGV4cG9ydF9pbmNsdWRlcz1bJ3NyYycsICcuJ10sCisgICAgICAgICkKKworICAgIGJsZC5pbnN0YWxsX2ZpbGVzKAorICAgICAgICBkZXN0ID0gIiVzL1BTeW5jIiAlIGJsZC5lbnZbJ0lOQ0xVREVESVInXSwKKyAgICAgICAgZmlsZXMgPSBibGQucGF0aC5hbnRfZ2xvYihbJ3NyYy8qKi8qLmhwcCcsICdzcmMvKiovKi5oJ10pLAorICAgICAgICBjd2QgPSBibGQucGF0aC5maW5kX2Rpcigic3JjIiksCisgICAgICAgIHJlbGF0aXZlX3RyaWNrID0gVHJ1ZSwKKyAgICAgICAgKQorCisgICAgYmxkLmluc3RhbGxfZmlsZXMoJyVzL1BTeW5jJyAlIGJsZC5lbnZbJ0lOQ0xVREVESVInXSwKKyAgICAgICAgICAgICAgICAgICAgICBibGQucGF0aC5maW5kX3Jlc291cmNlKCdwc3luYy1jb25maWcuaHBwJykpCisKKyAgICBwYyA9IGJsZCgKKyAgICAgICAgZmVhdHVyZXMgPSAic3Vic3QiLAorICAgICAgICBzb3VyY2U9J1BTeW5jLnBjLmluJywKKyAgICAgICAgdGFyZ2V0PSdQU3luYy5wYycsCisgICAgICAgIGluc3RhbGxfcGF0aCA9ICcke0xJQkRJUn0vcGtnY29uZmlnJywKKyAgICAgICAgUFJFRklYICAgICAgID0gYmxkLmVudlsnUFJFRklYJ10sCisgICAgICAgIElOQ0xVREVESVIgICA9ICIlcy9QU3luYyIgJSBibGQuZW52WydJTkNMVURFRElSJ10sCisgICAgICAgIFZFUlNJT04gICAgICA9IFZFUlNJT04sCisgICAgICAgICkKKworICAgIGlmIGJsZC5lbnZbJ1dJVEhfVEVTVFMnXToKKyAgICAgICAgYmxkLnJlY3Vyc2UoJ3Rlc3RzJykKKworZGVmIGRvY3MoYmxkKToKKyAgICBmcm9tIHdhZmxpYiBpbXBvcnQgT3B0aW9ucworICAgIE9wdGlvbnMuY29tbWFuZHMgPSBbJ2RveHlnZW4nLCAnc3BoaW54J10gKyBPcHRpb25zLmNvbW1hbmRzCisKK2RlZiBkb3h5Z2VuKGJsZCk6CisgICAgdmVyc2lvbihibGQpCisKKyAgICBpZiBub3QgYmxkLmVudi5ET1hZR0VOOgorICAgICAgICBibGQuZmF0YWwoJ0Nhbm5vdCBidWlsZCBkb2N1bWVudGF0aW9uICgiZG94eWdlbiIgbm90IGZvdW5kIGluIFBBVEgpJykKKworICAgIGJsZChmZWF0dXJlcz0nc3Vic3QnLAorICAgICAgICBuYW1lPSdkb3h5Z2VuLmNvbmYnLAorICAgICAgICBzb3VyY2U9Wydkb2NzL2RveHlnZW4uY29uZi5pbicsCisgICAgICAgICAgICAgICAgJ2RvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2Zvb3Rlci13aXRoLWFuYWx5dGljcy5odG1sLmluJ10sCisgICAgICAgIHRhcmdldD1bJ2RvY3MvZG94eWdlbi5jb25mJywKKyAgICAgICAgICAgICAgICAnZG9jcy9uYW1lZF9kYXRhX3RoZW1lL25hbWVkX2RhdGFfZm9vdGVyLXdpdGgtYW5hbHl0aWNzLmh0bWwnXSwKKyAgICAgICAgVkVSU0lPTj1WRVJTSU9OLAorICAgICAgICBIVE1MX0ZPT1RFUj0nLi4vYnVpbGQvZG9jcy9uYW1lZF9kYXRhX3RoZW1lL25hbWVkX2RhdGFfZm9vdGVyLXdpdGgtYW5hbHl0aWNzLmh0bWwnIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLmdldGVudignR09PR0xFX0FOQUxZVElDUycsIE5vbmUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgJy4uL2RvY3MvbmFtZWRfZGF0YV90aGVtZS9uYW1lZF9kYXRhX2Zvb3Rlci5odG1sJywKKyAgICAgICAgR09PR0xFX0FOQUxZVElDUz1vcy5nZXRlbnYoJ0dPT0dMRV9BTkFMWVRJQ1MnLCAnJykpCisKKyAgICBibGQoZmVhdHVyZXM9J2RveHlnZW4nLAorICAgICAgICBkb3h5ZmlsZT0nZG9jcy9kb3h5Z2VuLmNvbmYnLAorICAgICAgICB1c2U9J2RveHlnZW4uY29uZicpCisKK2RlZiBzcGhpbngoYmxkKToKKyAgICB2ZXJzaW9uKGJsZCkKKworICAgIGlmIG5vdCBibGQuZW52LlNQSElOWF9CVUlMRDoKKyAgICAgICAgYmxkLmZhdGFsKCdDYW5ub3QgYnVpbGQgZG9jdW1lbnRhdGlvbiAoInNwaGlueC1idWlsZCIgbm90IGZvdW5kIGluIFBBVEgpJykKKworICAgIGJsZChmZWF0dXJlcz0nc3BoaW54JywKKyAgICAgICAgY29uZmlnPSdkb2NzL2NvbmYucHknLAorICAgICAgICBvdXRkaXI9J2RvY3MnLAorICAgICAgICBzb3VyY2U9YmxkLnBhdGguYW50X2dsb2IoJ2RvY3MvKiovKi5yc3QnKSwKKyAgICAgICAgVkVSU0lPTj1WRVJTSU9OKQorCitkZWYgdmVyc2lvbihjdHgpOgorICAgICMgZG9uJ3QgZXhlY3V0ZSBtb3JlIHRoYW4gb25jZQorICAgIGlmIGdldGF0dHIoQ29udGV4dC5nX21vZHVsZSwgJ1ZFUlNJT05fQkFTRScsIE5vbmUpOgorICAgICAgICByZXR1cm4KKworICAgIENvbnRleHQuZ19tb2R1bGUuVkVSU0lPTl9CQVNFID0gQ29udGV4dC5nX21vZHVsZS5WRVJTSU9OCisgICAgQ29udGV4dC5nX21vZHVsZS5WRVJTSU9OX1NQTElUID0gVkVSU0lPTl9CQVNFLnNwbGl0KCcuJykKKworICAgICMgZmlyc3QsIHRyeSB0byBnZXQgYSB2ZXJzaW9uIHN0cmluZyBmcm9tIGdpdAorICAgIGdvdFZlcnNpb25Gcm9tR2l0ID0gRmFsc2UKKyAgICB0cnk6CisgICAgICAgIGNtZCA9IFsnZ2l0JywgJ2Rlc2NyaWJlJywgJy0tYWx3YXlzJywgJy0tbWF0Y2gnLCAnJXMqJyAlIEdJVF9UQUdfUFJFRklYXQorICAgICAgICBvdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChjbWQsIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKS5zdHJpcCgpCisgICAgICAgIGlmIG91dDoKKyAgICAgICAgICAgIGdvdFZlcnNpb25Gcm9tR2l0ID0gVHJ1ZQorICAgICAgICAgICAgaWYgb3V0LnN0YXJ0c3dpdGgoR0lUX1RBR19QUkVGSVgpOgorICAgICAgICAgICAgICAgIENvbnRleHQuZ19tb2R1bGUuVkVSU0lPTiA9IG91dC5sc3RyaXAoR0lUX1RBR19QUkVGSVgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgbm8gdGFncyBtYXRjaGVkCisgICAgICAgICAgICAgICAgQ29udGV4dC5nX21vZHVsZS5WRVJTSU9OID0gJyVzLWNvbW1pdC0lcycgJSAoVkVSU0lPTl9CQVNFLCBvdXQpCisgICAgZXhjZXB0IChPU0Vycm9yLCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcik6CisgICAgICAgIHBhc3MKKworICAgIHZlcnNpb25GaWxlID0gY3R4LnBhdGguZmluZF9ub2RlKCdWRVJTSU9OJykKKyAgICBpZiBub3QgZ290VmVyc2lvbkZyb21HaXQgYW5kIHZlcnNpb25GaWxlIGlzIG5vdCBOb25lOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBDb250ZXh0LmdfbW9kdWxlLlZFUlNJT04gPSB2ZXJzaW9uRmlsZS5yZWFkKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICMgdmVyc2lvbiB3YXMgb2J0YWluZWQgZnJvbSBnaXQsIHVwZGF0ZSBWRVJTSU9OIGZpbGUgaWYgbmVjZXNzYXJ5CisgICAgaWYgdmVyc2lvbkZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHZlcnNpb25GaWxlLnJlYWQoKSA9PSBDb250ZXh0LmdfbW9kdWxlLlZFUlNJT046CisgICAgICAgICAgICAgICAgIyBhbHJlYWR5IHVwLXRvLWRhdGUKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgZToKKyAgICAgICAgICAgIExvZ3Mud2FybignJXMgZXhpc3RzIGJ1dCBpcyBub3QgcmVhZGFibGUgKCVzKScgJSAodmVyc2lvbkZpbGUsIGUuc3RyZXJyb3IpKQorICAgIGVsc2U6CisgICAgICAgIHZlcnNpb25GaWxlID0gY3R4LnBhdGgubWFrZV9ub2RlKCdWRVJTSU9OJykKKworICAgIHRyeToKKyAgICAgICAgdmVyc2lvbkZpbGUud3JpdGUoQ29udGV4dC5nX21vZHVsZS5WRVJTSU9OKQorICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CisgICAgICAgIExvZ3Mud2FybignJXMgaXMgbm90IHdyaXRhYmxlICglcyknICUgKHZlcnNpb25GaWxlLCBlLnN0cmVycm9yKSkKKworZGVmIGRpc3QoY3R4KToKKyAgICB2ZXJzaW9uKGN0eCkKKworZGVmIGRpc3RjaGVjayhjdHgpOgorICAgIHZlcnNpb24oY3R4KQo=